grep,sed,awk三剑客

grep命令

  • grep [-cinvABC] 'word' filename
  • -c行数
  • -i不区分大小写
  • -n显示行号
  • -v取反
  • -r遍历所有子目录
  • -A后面跟数字,过滤出符合要求的行以及下面n行
  • -B后面跟数字,过滤出符合要求的行以及上面n行
  • -C后面跟数字,同时过滤出符合要求的行以及上下各n行

  • -c行数
[root@localhost ~]# cp /etc/passwd test.txt
[root@localhost ~]# cat 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@localhost ~]# grep -c 'nologin' test.txt 
15
  • -n显示行号
[root@localhost ~]# grep -n 'nologin' test.txt 
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15:dbus:x:81:81:System message bus:/:/sbin/nologin
16:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
17:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
18:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
  • -i不区分大小写
[root@localhost ~]# grep -i '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
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologi
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
  • -v取反
[root@localhost ~]# grep -iv '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
  • -r遍历所有子目录
[root@localhost ~]# grep -r 'root' /etc/ > 2.txt 
[root@localhost ~]# grep -r '/etc/passwd' 2.txt 
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/passwd-:root:x:0:0:root:/root:/bin/bash
/etc/passwd-:operator:x:11:0:operator:/root:/sbin/nologin
  • -A后面跟数字,过滤出符合要求的行以及下面n行
[root@localhost ~]# grep -nA2 'root' 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
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
  • -B后面跟数字,过滤出符合要求的行以及上面n行
[root@localhost ~]# grep -nB2 'root' test.txt 
1:root:x:0:0:root:/root:/bin/bash
--
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
  • -C后面跟数字,同时过滤出符合要求的行以及上下各n行
[root@localhost ~]# grep -nC2 'root' 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
--
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

grep/egrep示例

  • grep -n '[0-9]' test1.txt 列出test1.txt中包含数字的行。
[root@localhost ~]# grep -n '[0-9]' test1.txt 
9:# multi-user.target: analogous to runlevel 3
10:# graphical.target: analogous to runlevel 5
  • grep -vn '[0-9]' test1.txt 取反,列出test.txt中不带数字的行
[root@localhost ~]# grep -vn '[0-9]' test1.txt
1:# inittab is no longer used when using systemd.
2:#
3:# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
4:#
5:# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
6:#
7:# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
8:#
11:#
12:# To view current default target, run:
13:# systemctl get-default
14:abcdefg
15:#
16:# To set a default target, run:
17:# systemctl set-default TARGET.target
18:#
  • grep -nv '^#' test1.txt 列出test1.txt中不是以#号开头的
[root@localhost ~]# grep -nv '^#' test1.txt 
14:abcdefg
  • grep -n '^#' test1.txt 列出test1.txt中以#号开头的
[root@localhost ~]# grep -n '^#' test1.txt 
1:# inittab is no longer used when using systemd.
2:#
3:# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
4:#
5:# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
6:#
7:# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
8:#
9:# multi-user.target: analogous to runlevel 3
10:# graphical.target: analogous to runlevel 5
11:#
12:# To view current default target, run:
13:# systemctl get-default
15:#
16:# To set a default target, run:
17:# systemctl set-default TARGET.target
18:#
  • grep -v '^#' test1.txt |grep -v '^$'
[root@localhost ~]# grep -nv '^#' test1.txt |grep -v '^$'
9:$123456
16:abcdefg
  • grep '^[^0-9]' test1.txt 表示列出以非数字的字符开头的
[root@localhost ~]# grep -n '^[^0-9]' test1.txt 
1:# inittab is no longer used when using systemd.
2:#
3:# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
4:#
5:# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
6:#
7:# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
8:#abc123$
9:$123456
11:aaabbbccc
13:# multi-user.target: analogous to runlevel 3
14:# graphical.target: analogous to runlevel 5
15:#
16:# To view current default target, run:
17:# systemctl get-default
18:abcdefg
19:#
20:# To set a default target, run:
21:# systemctl set-default TARGET.target
22:#
  • grep -nv '^[^0-9]' test1.txt 表示列出以数字的字符开头的,包括空白行。
[root@localhost ~]# grep -nv '^[^0-9]' test1.txt 
10:123
12:
  • grep "r..t" test1.txt 列出test1.txt中r和t之间两个字母的内容
[root@localhost ~]# grep "r..t" test1.txt 
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
# To view current default target, run:
# To set a default target, run:
# systemctl set-default TARGET.target
  • grep "r.*t" test1.txt 匹配在r和t之间的任意字符
[root@localhost ~]# grep "r.*t" test1.txt
# inittab is no longer used when using systemd.
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
# To view current default target, run:
# To set a default target, run:
# systemctl set-default TARGET.target
  • grep 'o\ {2\ }' text1.txt =egrep 'o{2}' test.txt
[root@localhost ~]# grep 'o\{2\}' 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
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@localhost ~]# egrep 'o{2}' 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
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  • grep 'o\ {1,3\ }' test.txt = egrep 'o{1,3}' test.txt 表示test.txt文件中,字母o 出现的1次至3次的内容
[root@localhost ~]# grep 'o\{1,3\}' 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@localhost ~]# egrep 'o{1,3}' 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
  • grep -E 'root|nologin' test.txt 表示匹配root 或者nologin 的文件内容 = egrep'root|nologin' test.txt
[root@localhost ~]# grep -E 'root|nologin' test.txt 
root:x:0:0:root:/root:/bin/bash
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologi
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@localhost ~]# egrep 'root|nologin' test.txt
root:x:0:0:root:/root:/bin/bash
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologi
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin

sed 命令

主要是用来讲数据进行选取、替换、删除、新增的命令,如果不加-i选项是不会更改文件内容的,如果不确定的情况下,尽量不要更改系统中的配置文件。

  • sed [选项] '[动作]' 文件名

选项

  • -n :一般sed命令会把所有数据都输出到屏幕上,如果加上-n 则会把经过sed命令处理过的命令输出到屏幕上。
  • -e: 允许对输入数据应用多条sed命令编辑
  • -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

动作

  • a:追加,在当前行后添加一行或多行
  • c:行替换,用c后面的字符串替换原数据行
  • i:插入,在当前行插入一行或者多行
  • d:删除,删除指定的行
  • p:打印,输出指定的行
  • s:字符串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g"

-n :一般sed命令会把所有数据都输出到屏幕上,如果加上-n 则会把经过sed命令处理过的命令输出到屏幕上。

[root@localhost ~]# sed -n '/adm/'p test.txt 
adm:x:3:4:adm:/var/adm:/sbin/nologin
  • p打印1.txt 文件中的第二行
[root@localhost ~]# cat 1.txt 
aaa
bbb
ccc
111
222
333

[root@localhost ~]# sed -n '2'p 1.txt 
bbb
  • sed '2a hello word' 1.txt 在文件1.txt中第二行后面添加一行内容 hello word
[root@localhost ~]# sed '2a hello word' 1.txt 
aaa
bbb
hello word
ccc
111
222
333
  • sed '2i hello word' 1.txt 在文件1.txt中第二行前面添加一行内容 hello word
[root@localhost ~]# sed '2i hello word' 1.txt 
aaa
hello word
bbb
ccc
111
222
333
  • sed '2d' 1.txt 删除1.txt文件内容中的第二行
[root@localhost ~]# sed '2d' 1.txt
aaa
ccc
111
222
333
  • sed '4c 444' 1.txt 将1.txt 文件内容中的第四行替换为 444
[root@localhost ~]# sed '4c 444' 1.txt 
aaa
bbb
ccc
444
222
333
  • sed '1s/aaa/a1a/g' 1.txt 将第一行的aaa更改为a1a
[root@localhost ~]# sed '1s/aaa/a1a/g' 1.txt 
a1a
bbb
ccc
111
222
333
  • sed -i '1s/aaa/a1a/g' 1.txt 更改文件的内容并不输出
[root@localhost ~]# sed -i '1s/aaa/a1a/g' 1.txt 
[root@localhost ~]# cat 1.txt 
a1a
bbb
ccc
111
222
333
  • [root@localhost ~]# sed -e '1c 111' -e '2c 222' 1.txt 使用-e命令执行多条sed命令。将第一行更改为111,第二行更改为222
[root@localhost ~]# sed -e '1c 111' -e '2c 222' 1.txt
111
222
ccc
111
222
333

awk 命令

  • awk '条件1{动作1}条件2{动作2}...' 文件名
条件
  • 一般使用关系表达式作为条件
  • x > 10 判断变量 x是否大于10
  • x>=10 大于等于
  • x<=10 小于等于
动作
  • 格式化输出
  • 流程控制语句

关系式:BEGIN END

内置变量:FS


  • 使用关系式列出符合条件的文件内容

cat test.txt |grep "/bin/bash" | awk 'BEGIN{FS=":"}{print $1"\t" $3}'列出test.txt文件内容的/bin/bash中的以冒号分隔的第一列和第三列

[root@localhost ~]# cat test.txt |grep "/bin/bash" | awk 'BEGIN{FS=":"}{print $1"\t" $3}' 
root	0
user1	1000
user2	1001

提取磁盘跟文件下的磁盘使用百分比的数字

[root@localhost ~]# df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f 1
6

在文件1.txt内容 第二列前面添加一行 “hello word!”

[root@localhost ~]# cat 1.txt 
aaa	111
bbb	222
ccc	333
111	aaa
222	bbb
333	ccc

[root@localhost ~]# awk 'BEGIN{print "hello word!"}{print $2}' 1.txt 
hello word!
111
222
333
aaa
bbb
ccc

在文件1.txt内容 第一列后面添加一行 “hello word!”

[root@localhost ~]# cat 1.txt 
aaa	111
bbb	222
ccc	333
111	aaa
222	bbb
333	ccc

[root@localhost ~]# awk 'END{print "hello word!"} {print $1}' 1.txt 
aaa
bbb
ccc
111
222
333

hello word!

列出 test.txt文件中以冒号为分隔符并且第三列的数值大于等于1000,并打印出来第一列和第三列

[root@localhost ~]# awk '{FS=":"} $3>=1000{print $1 "\t" $3}' test.txt 
user1	1000
user2	1001

猜你喜欢

转载自my.oschina.net/u/3850965/blog/1824892