欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

grep、sed

程序员文章站 2023-12-26 15:13:27
...

一、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
[[email protected] ~]# 

二、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 : 查找替换, 支持使用其它分隔符,[email protected]@@ ,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

上一篇:

下一篇: