文章目录
-
- grep介绍
- sed介绍
- awk介绍
grep介绍
- .表示任意一个字符
- *表示零个或多个*前面的字符
- .*表示任意个任意字符
- ?表示0个或1个?前面的字符
- +表示1个或多个+前面的字符
- 正则就是一串有规律的字符串
过滤出有关键词的行:
[[email protected] grep]# grep 'nologin' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
过滤出含关键字的行,计算出有多少行:
[[email protected] grep]# grep -c 'nologin' passwd
18
过滤出含有关键字的行并列出行号:
[[email protected] grep]# grep 'nologin' passwd
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
过滤出含有关键字的行(不区分大小写):
[[email protected] grep]# grep -i 'nologin' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN
过滤出不含关键字的行:
[[email protected] grep]# grep -v 'nologin' passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN
sync:x:5:0:sync:/sbin:/bin/sync
-r子目录、孙目录所有下面的文件全部遍历一遍
寻找该目录下含有关键字的文件的行:
[[email protected] grep]# grep -r 'root' /etc/
将含有关键字的行列出并且列出该行底下两行:
[[email protected] grep]# grep -A2 'root' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN
将含有关键字的行列出并且列出该行上面两行:
[[email protected] grep]# grep -B2 'root' passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
过滤出含有数字的行:
[[email protected] grep]# grep '[0-9]' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN
过滤出不含有数字的行:
[[email protected] grep]# grep -v '[0-9]' passwd
过滤出以关键字符开头的行并列出行号:
[[email protected] grep]# grep -n '^#' /etc/inittab
1:# inittab is no longer used when using systemd.
2:#
3:# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
以非数字的字符开头的行:
[[email protected] grep]# grep '^[^0-9]' inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
含有非数字字符的行:
[[email protected] grep]# grep '[^0-9]' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN
匹配r+任意一个字符+o的行:
[[email protected] ~]# grep 'r.o' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
匹配o+重复0到n次*左边的字符+o的行:
[[email protected] ~]# grep 'o*o' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/rooot:/bin/bash
root:x:0:0:root:/roooot:/bin/bash
任意个任意字符:
[[email protected] ~]# grep '.*' passwd
匹配出现两次o的行:
[[email protected] ~]# grep 'o\{2\}' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/rooot:/bin/bash
[[email protected] ~]# egrep 'o{2}' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/rooot:/bin/bash
[[email protected] ~]# grep -E 'o{2}' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/rooot:/bin/bash
匹配1次或多次+前面的字符:
[[email protected] ~]# [[email protected] ~]# grep 'o\+o' passwd
匹配含0次或1次?前面的字符:
[[email protected] ~]# grep 'o\?t' passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
两个关键字能匹配其中一个就列出:
[[email protected] ~]# grep -E 'root|nologin' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sed介绍
匹配含有root的行:
[[email protected] sed]# sed -n '/root/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
匹配0个或多个r,后跟1个t的行:
[[email protected] sed]# sed -n '/r*t/'p test.txt
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
匹配1次或多次o,后跟一个t的行:
[[email protected] sed]# sed -nr '/o+t/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
- 加-r类似grep -E
打印指定行:
[[email protected] sed]# sed -n '2'p test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
打印指定范围的行:
[[email protected] sed]# sed -n '2,5'p test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
打印指定行到末尾行:
[[email protected] sed]# sed -n '22,$'p test.txt
ntp:x:38:38::/etc/ntp:/sbin/nologin
zhangfei:x:1000:1000::/home/zhangfei:/bin/bash
1242132532
zhang:x:1001:1001::/home/zhang:/bin/bash
- -e 不仅将指定行打印出来,还要匹配字符串
[[email protected] sed]# sed -e '1'p -e '/bus/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
[[email protected] sed]# sed -e '1'p -e '/bus/'p -e '/oo/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
匹配大写和小写字母:
[[email protected] sed]# sed -n '/bus/'Ip test.txt
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
删除指定的行(1到5行):
[[email protected] sed]# sed '1,5'd test.txt
删除包含指定关键词的行:
[[email protected] sed]# sed '/zhang/'d test.txt
关键词替换:
[[email protected] sed]# sed '1,10s/root/toor/g' test.txt
- 1,10代表第一行到第十行
- g代表全局替换
sed替换也可以使用正则:
[[email protected] sed]# sed -r '1,10s/ro+/r/g' test.txt
将每一行的首尾做替换:
[[email protected] sed]# head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
.* 贪婪匹配
- 第一部分([^:]+)找到所有不包含:的内容
- 第二部分(:.*:)通配第一个:之后的所有内容直到最后一个:
- 第三部分([^:]+)找到所有不包含:的内容
连起来就是第一部分是第一个:之前的内容,第二部分就是第一个:和最后一个:之间的内容,第三部分就是最后一个:之后的内容
\3\2\1 就是前面的第一部分排在第三,第二部分不变,第三部分排在第一
如果是第一部分和第二部分换,那就是/2/1/3
将/root换成123:
[[email protected] sed]# head test.txt |sed 's/\/root/123/g'
root:x:0:0:root:123:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
删除英文字母:
[[email protected] sed]# head test.txt |sed 's/[a-zA-Z]//g'
::0:0::/://
::1:1::/://
在所有行前面加上固定的字符串:
[[email protected] sed]# head test.txt |sed -r 's/(.*)/aaa:&/'
aaa:root:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/sbin/nologin
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
- &表示前面的小括号
awk介绍
以:为分隔符,打印第一段:
[[email protected] awk]# awk -F ':' '{print $1}' test.txt
如果没有规定分割符,系统默认会以空格符作为分隔符。
打印个别段:
[[email protected] awk]# awk -F ':' '{print $1,$3,$4}' test.txt
root 0 0
bin 1 1
daemon 2 2
指定显示的分隔符:
[[email protected] awk]# awk -F ':' '{print $1"#"$3"#"$4}' test.txt
root#0#0
bin#1#1
daemon#2#2
过滤出含有关键字的行:
[[email protected] awk]# awk '/oo/' test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
匹配第一段含关键字的行:
[[email protected] awk]# awk -F ':' '$1 ~ /oo/' test.txt
root:x:0:0:root:/root:/bin/bash
- ~意为匹配
匹配含root关键字并打印出第1、3段,匹配出含user关键字的行并打印3、4段:
[[email protected] awk]# awk -F ':' '/root/ {print $1 ,$3} /user/ {print $3,$4}' test.txt
root 0
operator 11
59 59
匹配含root或者zhang,并打印出整行:
[[email protected] awk]# awk -F ':' '/root|zhang/ {print $0}' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
zhangfei:x:1000:1000::/home/zhangfei:/bin/bash
zhang:x:1001:1001::/home/zhang:/bin/bash
匹配第三段等于0的行并且打印第一段:
[ro[email protected] awk]# awk -F ':' '$3==0 {print $1}' test.txt
root
匹配第三段大于等于1000的行并且打印整行:
[[email protected] awk]# awk -F ':' '$3>=1000 {print $0}' test.txt
zhangfei:x:1000:1000::/home/zhangfei:/bin/bash
zhang:x:1001:1001::/home/zhang:/bin/bash
- 加双引号,代表数字。
匹配某一段不为某字符的行:
[[email protected] awk]# awk -F ':' '$7!="/sbin/nologin"' test.txt
[[email protected] awk]# awk -F ':' '$7!="/sbin/nologin"' test.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
段与段之间的比较:
[[email protected] awk]# awk -F ':' '$3<$4' test.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
将两组段进行对比,满足条件的行打印出来:(&&表示第一条命令执行成功然后才会执行第二条)
[[email protected] awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
其中一条命令执行成功:
[[email protected] awk]# awk -F ':' '$3>1000 || $7=="/sbin/nologin"' test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
指定打印时的分隔符为#:
[[email protected] awk]# awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}' test.txt
root#0#/bin/bash
zhangfei#1000#/bin/bash
zhang#1001#/bin/bash
- NR 表示行
- NF 表示段
每一行前打印行号:
[[email protected] awk]# awk -F ':' '{print NR":"$0}' test.txt
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
将每一行的段数打印在每一行的行首:
[[email protected] awk]# awk -F ':' '{print NF":"$0}' test.txt
7:root:x:0:0:root:/root:/bin/bash
7:bin:x:1:1:bin:/bin:/sbin/nologin
7:daemon:x:2:2:daemon:/sbin:/sbin/nologin
7:adm:x:3:4:adm:/var/adm:/sbin/nologin
打印前十行:
[[email protected] awk]# awk -F ':' 'NR<=10' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
打印十行并且打印出第一段有root或者sync的行:
[[email protected] awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
打印出行数:段数:
[[email protected] awk]# awk -F ':' '{print $NR":"$NF}' test.txt
root:/bin/bash
x:/sbin/nologin
2:/sbin/nologin
4:/sbin/nologin
匹配并且赋值:
[[email protected] awk]# head -n3 test.txt |awk -F ':' ' $1="root"'
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
匹配等于关键词的行:
[[email protected] awk]# head -n3 test.txt |awk -F ':' ' $1=="root"'
root:x:0:0:root:/root:/bin/bash
每一次循环都会把第三段的值相加:
[[email protected] awk]# awk -F ‘:’ '{(tot=tot+$3)};END {print tot}' test.txt
72