一、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关系
将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