grep、sed

一、grep

1、统计包含关键字的行数(一行存在多个关键字,计数为1)

grep -c "keyword" filename

若文件中有多个关键字,需要统计所有关键字出现的次数

2、grep -o  :-o参数,可以逐行输出匹配的内容,有多少个匹配就有多少行

cat  filename | grep -o "keyword" | grep  -c  "keyword"

统计/etc/passwd中有多少个sbin,wc -l 用来统计行数

# cat /etc/passwd | grep -o "sbin" | wc -l

# cat /etc/passwd | tr ":" "\n" | grep "sbin" | wc -l

3、grep  -i  忽略字符大小写的差别

            -v   显示不包含匹配文本的所有行,即反选。如去掉注释行和空行

grep -v "#\|^$" /usr/lib/systemd/system/docker.service

4、grep  +关键字  -Anum -Bnum -Cnum

-Anum: after, 表示关键字后面nmu行    -Bnum: before, 关键字前nmu行   -Cnum:context, 关键字前后nmu行 

如:grep -C1 “18” test2.txt,  打印字符串“18”和它上一行和下一行的信息

5、-n:显示匹配的行号    加上-n选项后会在匹配到后显示所匹配的字符在哪一行

6、-e:实现多个选项间的逻辑or关系

如:grep –e ‘cat ’ -e ‘dog’ file
grep  -E  支持正则
7、-w 精确匹配
8、grep -i -n --color 忽略大小写并显示关键字的颜色
9、比较两个文件的相同处:(-f参数后面作为标准的文件一定不能有空行!、每行结尾也不要有空格才行。)
将file2里包含file1里的行,放到file3
grep -xFf file1 file2 > file3

-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。

-F 或 --fixed-regexp : 将样式视为固定字符串的列表。

-x --line-regexp : 只显示全列符合的列。

10、过滤当前路径下所有文件:grep -nr xxx .(r递归,n显示关键字在某个文件中的行号)
$ grep -nr xx   .
./xx.yml:1:xx:
./xx.yml:25:    # xx 存放程序的目录名(默认值就是xx)
./xx.yml:39:    folder_name: "xx"

二、pgrep

经常要查看进程的信息,包括进程的是否已经消亡,通过pgrep来获得正在被调度的进程的相关信息。pgrep通过匹配其程序名,找到匹配的进程

常用参数

    -l 同时显示进程名和PID
    -o 当匹配多个进程时,显示进程号最小的那个
    -n 当匹配多个进程时,显示进程号最大的那个

    注:进程号越大,并不一定意味着进程的启动时间越晚

使用实例如:

# pgrep  -l  nginx 
3706 nginx
3707 nginx
3708 nginx

pgrep相当于 ps –eo pid,cmd | awk ‘{print $1,$2}’ | grep KeyWord

#  ps -eo pid,cmd | awk '{print $1,$2}'  | grep nginx 
3706 nginx:
3707 nginx:
3708 nginx:

进程跟踪strace

strace -p 3706

 strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489

-tt 在每行输出的前面,显示毫秒级别的时间
-T 显示每次系统调用所花费的时间
-v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
-f 跟踪目标进程,以及目标进程创建的所有子进程
-e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
-o 把strace的输出单独写到指定的文件
-s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
-p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。

pgrep查找的是程序名,不包括其参数

# ps axu | grep name
root        1754  0.0  1.7 775664 65024 ?        Sl   17:30   0:00 /usr/bin/docker run --rm --ipc=host --net=host --entrypoint /usr/bin/ceph-mon --privileged --group-add=disk --name ceph-418abd02-42a9-11eb-91f4-000c298c369a-mon.node1 -e CONTAINER_IMAGE=docker.io/ceph/ceph:v15 -e NODE_NAME=node1 -v /var/run/ceph/418abd02-42a9-11eb-91f4-000c298c369a:/var/run/ceph:z -v /var/log/ceph/418abd02-42a9-11eb-91f4-000c298c369a:/var/log/ceph:z -v /var/lib/ceph/418abd02-42a9-11eb-91f4-000c298c369a/crash:/var/lib/ceph/crash:z -v /var/lib/ceph/418abd02-42a9-11eb-91f4-000c298c369a/mon.node1:/var/lib/ceph/mon/ceph-node1:z -v /var/lib/ceph/418abd02-42a9-11eb-91f4-000c298c369a/mon.node1/config:/etc/ceph/ceph.conf:z -v /dev:/dev -v /run/udev:/run/udev docker.io/ceph/ceph:v15 -n mon.node1 -f --setuser ceph --setgroup ceph --default-log-to-file=false --default-log-to-stderr=true --default-log-stderr-prefix=debug  --default-mon-cluster-log-to-file=false --default-mon-cluster-log-to-stderr=true
root        1794  0.0  1.6 775664 62928 ?        Sl   17:30   0:00 /bin/docker run --rm --ipc=host --net=host --entrypoint /usr/bin/ceph-crash --name ceph-418abd02-42a9-11eb-91f4-000c298c369a-crash.node1 -e CONTAINER_IMAGE=docker.io/ceph/ceph:v15 -e NODE_NAME=node1 -v /var/run/ceph/418abd02-42a9-11eb-91f4-000c298c369a:/var/run/ceph:z -v /var/log/ceph/418abd02-42a9-11eb-91f4-000c298c369a:/var/log/ceph:z -v /var/lib/ceph/418abd02-42a9-11eb-91f4-000c298c369a/crash:/var/lib/ceph/crash:z -v /var/lib/ceph/418abd02-42a9-11eb-91f4-000c298c369a/crash.node1/config:/etc/ceph/ceph.conf:z -v /var/lib/ceph/418abd02-42a9-11eb-91f4-000c298c369a/crash.node1/keyring:/etc/ceph/ceph.client.crash.node1.keyring docker.io/ceph/ceph:v15 -n client.crash.node1

用pgrep查询,不是进程名的,是不会被查到

#  pgrep name
[root@node1 ~]# 

二、sed

sed命令常用选项:sed  [选项]   ‘范围 动作’    文件

「选项」

-n :不输出模式空间内容到屏幕,即不自动打印
-e :多点编辑
-f :/ PATH/SCRIPT_FILE :  从指定文件中读取编辑脚本
-r :支持使用扩展正则表达式
-i : 修改源文件
-i.bak : 备份文件并原处编辑
-v : 打印版本和版权信息。

‘地址范围 动作’

地址范围:

(1)没有地址:默认对全文进行处理。

(2)单地址:

X:指定的行

/pattern/:被匹配到的每一行

(3)地址范围:

X1,X2 : 选取第 X1 行到 X2 行之间的行

X1,+X2 : 选取第 X1 行之后的 X2 个行

/pat1/,/pat2/ : 选取 pat1 第一次匹配到的行到 pat2 第一次匹配到的行之间的行

X,/pat1/ : 选取 X 第一次匹配到的行到 pat1 第一次匹配到的行

(4)X1~X2 : 步长

1~2 : 从1开始,步进为2(奇数行)

2~2 : 从2开始,步进为2(偶数行)

动作:

d : 删除模式空间匹配的行,并立即启用下一轮循环
p : 打印当前模式空间内容,追加到默认输出之后
a [\]text : 在指定行后面追加文本。支持使用\n 实现多行追加
i [\]text : 在行前面插入文本
c [\]text : 替换行为单行或多行文本
w : 保存模式匹配的行至指定文件
r : 读取指定文件的文本至模式空间中匹配到的行后
= : 为模式空间中的行打印行号
! : 模式空间中匹配行取反处理
s/X/X/g : 查找替换, 支持使用其它分隔符,s@@@ ,s### y/XX/XX/ : 检索所有匹配的项,替换为对应的字符
基础用法

测试文件(11 12 为空行)

#cat -n  test.file
     1	1a
     2	2b
     3	3c
     4	4d
     5	5e
     6	6f
     7	7g
     8	8h
     9	9j
    10	10k
    11	
    12	

打印基数行

#sed  -n '1~2 p'  test.file
1a
3c
5e
7g
9j

打印1到3行

sed  -n '1,3 p'  test.file
1a
2b
3c

打印带有字母a或带有字母c的行,「」表示可选,但必须带上-n,才能有输出

#sed -n '/[ac]/ p' test.file 
1a
3c

打印c到e的行/c/,/e/

sed -n '/c/,/e/ p' test.file 
3c
4d
5e

在第3行前一行插入字符i

sed  '3 i zjz' test.file 
1a
2b
zjz
3c

将每行第二个字符删除 -r支持正则

#sed -r 's/(.)(.)/\1/' test.file 
11a
22b
33c
44d

所有的空格被删掉。-r选项支持扩展正则表达式(相当于sed ‘s/^\(.\)\(.\)/\1/’)另一种方式sed ‘/.//2’ file ”

把所有a替换为A,-y选项是把前面匹配的项全部对应替换为后面的字符

sed  'y/a/A/' test.file 
1  A
2  b

进阶用法

将1行放到3行后面

#sed  ' 1h;3G ' test.file 
1  a
2  b
3  c
1  a
4  d

h:将模式空间的内容覆盖保持空间中
G:将保持空间内容追加到模式空间中

在每行后面添加1个空行,保持空间默认有一个空白行

sed  ' 1,$G ' test.file 
1  a

2  b

3  c

4  d

5  e

把1到4行放在5行后面

sed  ' 1h;2,4H;5G;1,4d' test.file 
5  e
1  a
2  b
3  c
4  d
6  f
7  g
8  h
9  j

1h:覆盖掉保持空间中的空白行
1,4d:删除最前面的4行

将第3行替换为第1行内容

sed -n  '1h;3x;p' test.file 
1  a
2  b
1  a
4  d
5  e

常见用法

1、sed 命令 -n 选项的用法

sed  -n  '1p'   /etc/passwd (显示passwd文件的第一行,不加n则会全部显示,p是打印)
sed  -n  '1,4d'  /etc/passwd (d删除,删除passwd的1-4行内容,并显示删除后的内容)
sed  -n  '1p;5p'  /etc/passwd (显示第一行和第五行)

2、sed中&符号

sed -ri 's/.*swap.*/#&/' /etc/fstab     &符号就是代表前面.*匹配的到字符

3、sed  "\(\)" 和\1和\2...的组合使用

sed  '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

将aabbccddeeffgghh替换为aa:bb:cc:dd

sed   -ri   's/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/'

第一个\(..\)表示匹配任意2个字符,并且对应后面的\1
对于字符串aabbccddeeffgghh而言,就是aa这2个字符
同理,第二\(..\)匹配bb,对应\2;第三\(..\)匹配cc,对应\3;第四\(..\)匹配dd,对应\4
剩下的eeffgghh匹配 .*$,其中.*表示匹配任意个字符,$匹配到末尾,这些字符串被抛弃

4、sed工具p输出操作

sed -n '/local$/p' 1.txt 输出以local结尾的行
sed -n 'p;n' 1.txt 输出基数行
sed -n 'n;p' 1.txt 输出偶数行
sed -n '5,$p' 1.txt 输出从第五行到最后一行
sed -n '$=' 1.txt 输出文本的总行数

5、sed工具的d输出操作(不要加-n)

sed '3,5d' 1.txt 删除3-5行
sed '/init/d' 1.txt 删除包含init所有的行
sed '/init/d;/bin/d' 1.txt 删除所有包含init和bin的行
sed '/init/!d' 1.txt 删除不包含init的行
sed '$d' 1.txt 删除最后一行
sed '/^$/d' 1.txt 删除文件中所有的空行

6、sed工具的s替换操作

sed 's/ll/AA/' 1.txt 将所有行的第一个ll替换为AA
sed 's/ll/AA/g' 1.txt 将所有行的ll替换为AA
sed '3s/script/SCRIPT/2' 1.txt 将第三行内的第二个script替换为SCRIPT
sed 's/init//g' 1.txt 删除所有的init字符
sed 's/script|init\e//g' 删除所有的script init e 的字符
sed '3,5s/^#//' 1.txt 解除3到5行的#注释
sed '6,7s/^/#/' 1.txt 给6到7行添加注释
sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config

7、sed的扩展

sed 's/.//2;s/.$//' 1.txt 删除每行的第二个字符和最后一个字符
sed -r 's/^(.)(.)(.)/\2\1\3/' 把每行的第一个字符和第二个字符互换
sed -r 's/[0-9]//g;s/^( )+//' 1.txt 把文件中所有数字,和首行空格删除;
sed 's/[A-Z]/(&)/g' 1.txt 把文件中每个大写字母添加括号

8、删除空白行和注释行

sed -ri.bak '/^[ \t]*#|^[ \t]*$/d' /etc/ntp.conf  删除前先备份整个文件

###grep方式
grep -Ev  "^#|^$" config
SELINUX=disabled
SELINUXTYPE=targeted

https://www.cnblogs.com/liuzhiyun/p/11303501.html

https://blog.csdn.net/shi7876061/article/details/79919044

https://pan.baidu.com/s/1bpkRAUBv7EL5TQ_oKBFeOA

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少安在线锤人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值