【linux】grep、awk、sed实战练习(1)-template
一、grep常见用法
1.1.从文件中查找关键字符串
# 比如:查找/etc/nginx/nginx.conf文件包含"listen"的行
[root@ecs_server test]# grep "listen" -n /etc/nginx/nginx.conf
52: listen 8088;
87: listen 8096;
# 比如:查找/etc/passwd文件包含"root"的行
方法一:直接从文件中查找
[root@ecs_server ~]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
方法二:通过管道符号传输查找
[root@ecs_server ~]# cat /etc/passwd|grep "root"
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
1.2.从目录中查找关键字符串
# 比如:查找/home/下包含"李四"或"张三"的文件及行号
[root@ecs_server test]# grep -E "李四|张三" -n -r /home/
/home/test/a1.txt:4:李四
/home/test/b1.txt:10:李四
# 比如:比对/home/下a.xml和b.xml中ContactNumber字段的区别
[root@ecs_server test]# grep "ContactNumber" -n -r /home/
/home/test/b.xml:106: <ContactNumber></ContactNumber>
/home/test/a.xml:106: <ContactNumber>56451234</ContactNumber>
1.3.精确查找文件中包含的单词
使用grep中单词的定界符号:(\<...\> 或者 \b...b\),用于选取准确的字符串。
\< 和\b 是以什么开头;\>和b\ 是以什么结尾;\<...\> 或者 \b...b\ 是指查找这个单词
[root@ecs_server test]# cat d定界符.txt
lisi123
lisiabcde
45lisi
alisi
99lisi123
lisi
zhagnsan
# 单词以lisi开头
[root@ecs_server test]# cat d定界符.txt |egrep "\<lisi"
lisi123
lisiabcde
lisi
[root@ecs_server test]# cat d定界符.txt |egrep "\blisi"
lisi123
lisiabcde
lisi
# 单词以lisi结尾
[root@ecs_server test]# cat d定界符.txt |egrep "lisi\>"
45lisi
alisi
lisi
[root@ecs_server test]# cat d定界符.txt |egrep "lisi\b"
45lisi
alisi
lisi
# 单词以lisi开头和结尾
[root@ecs_server test]# cat d定界符.txt |egrep "\<lisi\>"
lisi
[root@ecs_server test]# cat d定界符.txt |egrep "\blisi\b"
lisi
# 比如:根据进程号(pid=442073)查看进程
[root@ecs_server test]# ps aux|egrep "\<442073\>"
root 442073 0.0 0.0 26828 924 ? Ss Jan02 0:00 nginx: master process /usr/sbin/nginx
root 488726 0.0 0.0 12144 1204 pts/2 S+ 14:42 0:00 grep -E --color=auto \<442073\>
1.4.查看文件(滤除空行和注释行)
去除 #开头的注释行、空格键开头的空行、空行】,并显示行号,正则表达式:"\s*#|^$|^#"
[root@ecs_server-01 test]# cat /etc/login.defs |egrep -v -n "\s*#|^$|^#"
15:MAIL_DIR /var/spool/mail
25:UMASK 022
30:HOME_MODE 0700
39:PASS_MAX_DAYS 99999
40:PASS_MIN_DAYS 0
41:PASS_MIN_LEN 5
42:PASS_WARN_AGE 7
47:UID_MIN 1000
48:UID_MAX 60000
50:SYS_UID_MIN 201
51:SYS_UID_MAX 999
56:GID_MIN 1000
57:GID_MAX 60000
59:SYS_GID_MIN 201
60:SYS_GID_MAX 999
74:CREATE_HOME yes
78:USERGROUPS_ENAB yes
81:ENCRYPT_METHOD SHA512
1.5.查出文件中包含的特殊字符
# |sort|uniq 排序 去重 查找出包含的特殊字符
[root@ecs_server test]# egrep -o "[^0-Z]" /etc/ssh/sshd_config |sort|uniq
!
"
#
'
(
)
,
-
.# 列出包含特殊字符的所在行
[root@ecs_server test]# cat /etc/ssh/sshd_config |egrep -n -o "[^0-Z]"
1:#
1:
1:$
1::
1:
1:_
1:,
1:
1:.
二、awk常见用法
awk是一种文本处理工具,它可以从文件或标准输入中逐行读取文本,并对每行文本进行指定操作。
两种语法格式
1.awk [选项] 命令 文本 #命令可分为三段 == ‘ BEGIN{print 1/2}’ {print”ok”} END{print”-----”}’
2.awk [选项] -f 脚本 文本
2.1.awk截取文件内容
比如:awk截取passwd文件的用户名以及密码
[root@ecs_server test]# awk -F ":" '{print $1,$2}' /etc/passwd|head -n 10
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
operator x
2.2.awk命令的操作命令(BEGIN、END、NF、NR)
$1~/root/ :表示在第一个字段里面包含“root”
$3>1005 :UID大于1005的
BEGIN :只在文件开头运行一次
END :只在文件结尾运行一次
NF :一行里有多少个字段(列)
NR : 行号
$NF :最后一个字段
length($1) :表达 $1 字段的长度
[root@ecs_server-01 test]# awk -F ":" 'BEGIN{num=0;print "开始处 理文件/etc/passwd"} $1~/root/ || $3>1005 {print NR,NF,$1,length($1),$NF,$(NF-1),$3;num++} END{print "total:" num}' /etc/passwd
开始处 理文件/etc/passwd
1 7 root 4 /bin/bash /root 0
13 7 nobody 6 /sbin/nologin / 65534
total:2
2.3 awk的for循环
user[$1]=$3 :赋值操作,user类似是一个字典key=$1,value=$3,{tss:59,clevis:997,……}
login[$1]=$7 :赋值操作,{root:/bin/bash,bin:/sbin/nologin,……}
[root@ecs_server test]# cat /etc/passwd|awk -F ":" '{user[$1]=$3;print $1,user[$1]}'|head
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11
[root@ecs_server test]# cat /etc/passwd|awk -F ":" '{login[$1]=$7;print $1,login[$1]}'|head
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
[root@ecs_server test]# cat /etc/passwd|awk -F ":" '{user[$1]=$3}END{for(i in user) print i,user[i]}'|head
tcpdump 72
sshd 74
setroubleshoot 991
systemd-resolve 193
shutdown 6
bin 1
redis 987
chrony 990
tss 59
mail 8
三、sed常见用法
sed命令是一种流编辑器,用于对文本进行处理和转换。它可以读取文本文件并对其进行编辑、替换、删除、插入等操作,可以实现批量修改文件内容的功能。 sed是一种支持正则表达式的非交互式流编辑器(stream editor),是脚本中修改文本或者文本替换的最佳工具。
可参考:
如有问题之处,请多多指教。