20180625 正则 9.1 - 9.7
9.1 正则介绍_grep(上)
9.2/9.3 grep
9.4/9.5 sed
9.6/9.7 awk
what is ZhengZe
php, python, java 都有正则, 有了正则, 可以实现复杂的需求 , grep, sed, awk 是 shell script 三剑客
正则就是一串有规律的字符串
掌握好正则对于编写shell脚本有很大帮助
各种编程语言中都有正则,原理是一样的
本章将要学习grep/egrep、sed、awk
I. grep
grep [-cinvABC] 'word' filename
-c 行数
-i 不区分大小写
-n 显示行号
-v 取反
-r 遍历所有子目录
-A 后面跟数字,过滤出符合要求的行以及下面n行
-B 同上,过滤出符合要求的行以及上面n行
-C 同上,同时过滤出符合要求的行以及上下各n行
root@arron-02:~# which grep
alias grep='grep --color=auto'
/usr/bin/grep
C6 中在使用 grep 时 不带选中字体的颜色, 而 C7 是带颜色的
C7 过滤字符, 带颜色显示, 如下所示
C6 过滤字符, 不带颜色显示, 如下所示
- -c (总行数)/ -n 每行的行号
root@arron-02:~# grep -c 'nologin' /etc/passwd
16
root@arron-02:~# grep -n 'nologin' /etc/passwd
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:998:User for polkitd:/:/sbin/nologin
17:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
18:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
21:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
- -i 不区分大小写
## 更改 passwd 文件, 将如下的单词中的几个字符改为大写
root@arron-02:~# vim 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
adm:x:3:4:adm:/var/adm:/Sbin/nologin
......
## 不加 -i , 不显示 nologin 中含大写字母的那行
root@arron-02:~# grep -n 'nologin' passwd
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:998:User for polkitd:/:/sbin/nologin
17:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
18:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
21:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
## 加 -i 再查看结果
root@arron-02:~# grep -ni 'nologin' passwd
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:998:User for polkitd:/:/sbin/nologin
17:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
18:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
21:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
- -v 取反
## 将不带 nologin 的行过滤出来了
root@arron-02:~# grep -vni 'nologin' passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
20:arron:x:1000:1000::/home/arron:/bin/bash
- -r 遍历子目录
## 显示 /etc/ 下的带 'root' 的目录
root@arron-02:~# grep -r 'root' /etc/|less
/etc/grub.d/01_users: set superusers="root"
/etc/grub.d/01_users: set superusers="root"
/etc/grub.d/01_users: password_pbkdf2 root \${GRUB2_PASSWORD}
......
## 不带 -r , 就不去遍历
root@arron-02:~# grep 'root' /etc/
grep: /etc/: Is a directory
## 如果在 /etc/ 下不好找 /etc/passwd, 可以重定向到 log 里边去, 再去查找
root@arron-02:~# grep -r 'root' /etc/ > /tmp/grep.log ; grep 'passwd' /tmp/grep.log
/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
/etc/postfix/main.cf:# the system passwd file in the chroot jail is just not practical.
- -A , -B , -C
-A 打印出过滤字符的那行及下边的 n 行列出来 -B 打印出过滤字符的那行及上边的 n 行列出来 -C 打印出过滤字符的那行, 上边的 n 行及下边的 n 行都列出来
## -A 打印出过滤字符的那行及下边的 n 行列出来
root@arron-02:~# grep -nA3 'root' passwd
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
4-adm:x:3:4:adm:/var/adm:/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
## -B 打印出过滤字符的那行及上边的 n 行列出来
root@arron-02:~# grep -nB3 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
--
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
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 行及下边的 n 行都列出来
root@arron-02:~# grep -nC3 'root' passwd
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
4-adm:x:3:4:adm:/var/adm:/Sbin/nologin
--
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
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
13-nobody:x:99:99:Nobody:/:/sbin/nologin
9.2/9.3 grep
grep/egrep示例
grep -n 'root' /etc/passwd
grep -nv 'nologin' /etc/passwd
grep '[0-9]'/etc/inittab
grep -v '[0-9]'/etc/inittab
grep -v '^#' /etc/inittab
grep -v '^#' /etc/inittab|grep -v '^$'
grep '^[^a-zA-Z]' test.txt
grep 'r.o' test.txt
grep 'oo*' test.txt
grep '.*' test.txt
grep 'o\{2\}' /etc/passwd
egrep 'o{2}' /etc/passwd
egrep 'o+' /etc/passwd
egrep 'oo?' /etc/passwd
egrep 'root|nologin' /etc/passwd
egrep '(oo){2}' /etc/passwd
- [] 示例
## 习题演练
root@arron-02:~# grep -nv 'nologin' passwd
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
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
20:arron:x:1000:1000::/home/arron:/bin/bash
root@arron-02:~# 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
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
....
## 在 inittab 中操作
root@arron-02:~# cp /etc/inittab .; ls
1.txt.bak 2.txt.1 X.txt a.txt anaconda-ks.cfg inittab peter.txt test
2.txt 2.txt.bak Y.txt abc.txt arronlinux passwd season3.zip z.txt
root@arron-02:~# grep '[0-9]' inittab
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
root@arron-02:~# grep -v '[0-9]' inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
....
- ^ 示例
## ^# 以 # 开头的行
root@arron-02:~# grep -n '^#' inittab
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
.....
## '^#' 且 -v '^$'
### 编辑 inittab , 再查看
### 增加一行(如下)
abcdefghijklmnopqrstuvwxyz
root@arron-02:~# vim inittab
# inittab is no longer used when using systemd.
......
#
abcdefghijklmnopqrstuvwxyz
# To set a default target, run:
# systemctl set-default TARGET.target
root@arron-02:~# grep -nv '^#' inittab
15:abcdefghijklmnopqrstuvwxyz
## 再增加一些字符到 inittab 里边去, 但是不要更改 /etc/ 下的文件, 不然系统无法启动
[^0-9] 表示非 0-9 的字符, 只匹配那一个字符
## 在 inittab 中再增加一串字符
11111111a333333333
结果依然一样
^[^0-9] 表示以 非 0-9 开头
root@arron-02:~# grep '^[^0-9]' inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# 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:
&*&(*&(*&*
^ 放在[] 里头表示将 [] 里边的字符取非(不是行取非), 将 ^ 放到 [] 外头表示以 [] 里边的释义开头
.
匹配任意一个字符
root@arron-02:~/grep# grep 'r.o' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
arron:x:1000:1000::/home/arron:/bin/bash
## 编辑 passwd 文件(插入如下两行)后再试
fahsjkfa:fsajfkl:112:afd:rao:90
....
afdajdk:r>o:russia
## 发觉刚才的两行都匹配到了
root@arron-02:~/grep# grep 'r.o' passwd
root:x:0:0:root:/root:/bin/bash
fahsjkfa:fsajfkl:112:afd:rao:90
afdajdk:r>o:russia
operator:x:11:0:operator:/root:/sbin/nologin
arron:x:1000:1000::/home/arron:/bin/bash
## 再增加一行, 发觉也可以匹配到 .
afdajdk:r.o:russia
root@arron-02:~/grep# grep 'r.o' passwd
root:x:0:0:root:/root:/bin/bash
fahsjkfa:fsajfkl:112:afd:rao:90
afdajdk:r>o:russia
afdajdk:r.o:russia
operator:x:11:0:operator:/root:/sbin/nologin
arron:x:1000:1000::/home/arron:/bin/bash
*
匹配前面字符, 不论数量多少;.*
匹配了所有的字符, 甚至是空行
## 在 passwd 里边增加了两行
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
root@arron-02:~/grep# grep 'o*o' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/Nologin
...
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
## .* 匹配了所有的行, 甚至包括了空行
root@arron-02:~/grep# grep '.*' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/Nologin
fahsjkfa:fsajfkl:112:afd:rao:90
...
root@arron-02:~/grep# grep 'arron.*bash' passwd
arron:x:1000:1000::/home/arron:/bin/bash
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
{}
在正则中, 它表示一个范围
## 匹配不了数字
root@arron-02:~/grep# grep '{3,4}' passwd
## 匹配一个范围
root@arron-02:~/grep# grep 'o{2}' passwd
## 如上说明在正则中 {} 需要脱意
root@arron-02:~/grep# grep 'o\{2\}' passwd
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
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
## {} 可以匹配一个区间范围, 其实这种匹配太宽泛 , 没具体意义
root@arron-02:~/grep# grep 'o\{0,1\}' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/Nologin
...
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
- grep 不带脱意符号, 就是 egrep (grep -E) ; () 里边可表示一个固定的字符串
root@arron-02:~/grep# grep -E 'oo{2}' passwd
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
## () 里边可表示一个固定的字符串
root@arron-02:~/grep# egrep '(oo){2}' passwd
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
root@arron-02:~/grep# grep -E '(oo){2}' passwd
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
+
表示匹配 1次或多次前面的字符
root@arron-02:~/grep# grep 'o\+o' passwd
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
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
root@arron-02:~/grep# grep 'o\+b' passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
## 同时看出, () 和 {} 也需要脱意
root@arron-02:~/grep# grep '(oo)\{2\}' passwd
root@arron-02:~/grep# grep '\(oo\)\{2\}' passwd
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
?
表示匹配零次或壹次前面字符
## 更改一行为如下所示
afdajdk:ro1o:russia
## 发觉 ? 也需要脱意
root@arron-02:~/grep# grep 'o\?1o' passwd
afdajdk:ro1o:russia
## 再增加一行重试
aaaaaa:1o:11111
root@arron-02:~/grep# grep 'o\?1o' passwd
afdajdk:ro1o:russia
aaaaaa:1o:11111
|
表示或者, 也要脱意
root@arron-02:~/grep# grep 'root\|nologin' passwd
root:x:0:0:root:/root:/bin/bash
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
...
root@arron-02:~/grep# grep -E 'root|nologin' passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/Sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
...
root@arron-02:~/grep# grep -E 'root|Bus|997' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
root@arron-02:~/grep# grep 'root\|Bus\|997' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
9. 总结:
a. .
(dot) 表示任意一个字符,
b. *
表示零个或多个 *
前面的字符,
c. .*
表示通配(所有的都匹配) ,
d. {}
表示前面字符的一个范围
e. ()
表示其里边的是一个整体
f. +
一个或多个其前面的字符
g. ?
零个或一个其前面的字符
h. |
表示或者
i. {}
, ()
, +
, ?
, |
都要脱意
9.4/9.5 sed
sed 工具
sed -n '5'p test.txt
sed -n '1,5'p test.txt
sed -n '1,$'p test.txt
sed -n '/root/'p test.txt
sed -n '/^1/'p test.txt
sed -n 'in$'p test.txt
sed -n '/r..o/'p test.txt
sed -n 'oo*'p test.txt
sed -e '1'p -e '/111/'p -n test.txt
sed '1'd test.txt
sed '1,3'd test.txt
sed '/oot/'d test.txt
sed '1,2s/ot/to/g' test.txt
sed 's#ot#to#g' test.txt
sed 's/[0-9]//g' test.txt
sed 's/[a-zA-Z]//g' test.txt
sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt
sed 's/^.*$/123&/' test.txt
sed -i 's/ot/to/g' test.txt
sed , 最大的作用是替换, 支持正则的通配符; sed 不支持颜色显示
-n
, 去重复
root@arron-02:~# mkdir sed; cd sed/ ; cp ../grep/passwd ./test.txt; ls
test.txt
root@arron-02:~/sed# sed -n '/root/p' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
.
,*
等通配符
root@arron-02:~/sed# sed -n '/r.t/p' test.txt
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
root@arron-02:~/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
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
2.1 也支持符号 +
, 但是要脱意, 不过不脱意可以直接加上 -r
选项, -r
是扩展正则, 与 \
没有关系
root@arron-02:~/sed# sed -n '/o\+t/p' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
root@arron-02:~/sed# sed -nr '/o+t/p' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
2.2 支持 {}
, +
## 支持 {}
root@arron-02:~/sed# sed -nr '/o{2}/p' 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
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
## 支持 |
root@arron-02:~/sed# sed -nr '/root|bus/p' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
- 打印指定的行 (输入的数字表示行号) , 直接跟数字, 不需要
//
框定数字 , 如果是单个数字, 用 // 框定就表示打印内容中有这个数字的行
## 打印指定的行 (根据行号来写数字)
root@arron-02:~/sed# sed -n '2'p test.txt
bin:x:1:1:bin:/bin:/sbin/Nologin
## 也可以打印多行
root@arron-02:~/sed# sed -n '2,5'p test.txt
bin:x:1:1:bin:/bin:/sbin/Nologin
fahsjkfa:fsajfkl:112:afd:rao:90
daemon:x:2:2:daemon:/sbin:/sbin/Nologin
adm:x:3:4:adm:/var/adm:/Sbin/nologin
root@arron-02:~/sed# sed -n '/2/'p test.txt
fahsjkfa:fsajfkl:112:afd:rao:90
daemon:x:2:2:daemon:/sbin:/sbin/Nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
root@arron-02:~/sed# sed -n '25,$'p test.txt
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
3
4
## 打印整篇文档 '1,$'
root@arron-02:~/sed# sed -n '1,$'p test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/Nologin
fahsjkfa:fsajfkl:112:afd:rao:90
daemon:x:2:2:daemon:/sbin:/sbin/Nologin
...
-e
做多个操作
root@arron-02:~/sed# sed -e '1'p -e '/bus/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
## 如果出现 /word1/word2 等字符时, 用 -r 实现不了, 用 \ 去脱意效果还不错
root@arron-02:~/sed# sed -n -r -e '1'p -e '/bus/'p -e '//sbin/nologin/'p test.txt
sed:-e 表达式 #3,字符 16:未终止的“s”命令
root@arron-02:~/sed# sed -n -e '1'p -e '/bus/'p -e '/\/sbin\/nologin/'p 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
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
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
I
选项, 匹配大写
## 更改 test.txt , 增加 BUs
aaaaaa:1o:11111:BUs
root@arron-02:~/sed# sed -n '/bus/'Ip test.txt
aaaaaa:1o:11111:BUs
dbus:x:81:81:System message bus:/:/sbin/nologin
d
删除打印的指定行, 文档内容不变, 只是显示在屏幕上的是删除后的行; 如果想删除文档内容,-i
即可
## 删除行号指定的行
root@arron-02:~/sed# sed '1,25'd test.txt
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
3
4
root@arron-02:~/sed# wc -l test.txt
31 test.txt
-i
和 d 删除文档内容, 必须配合d
一起才能删除
root@arron-02:~/sed# sed -i '1,25'd test.txt
root@arron-02:~/sed# cat test.txt
arron:x:1000:1000::/hoooome/arroon:/bin/bash
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
3
4
## 由下可以, 如果有多个字符, 在 sed 中 , 匹配时必须用 //
root@arron-02:~/sed# sed -i 'arron'd test.txt
root@arron-02:~/sed# cat test.txt
arron:x:1000:1000::/hoooome/arroon:/bin/bash
rrond
arron:x:1000:1000::/hooome/arrooooon:/bin/bash
rrond
rrond
rrond
3
rrond
4
rrond
root@arron-02:~/sed# sed -i '/arron/'d test.txt; cat test.txt
rrond
rrond
rrond
rrond
3
rrond
4
rrond
root@arron-02:~/sed# sed -i '/rron/'d test.txt; cat test.txt
3
4
- 替换 , 其功能与 vim 的用法类似; 用法: line1,line2s/word1/word2/g
## 虽然只有 第一行到第十行, 但是还是将所有的行列出来了
root@arron-02:~/sed# sed '1,10s/root/toor/g' test.txt
toor:x:0:0:toor:/toor:/bin/bash
bin:x:1:1:bin:/bin:/sbin/Nologin
fahsjkfa:fsajfkl:112:afd:rao:90
daemon:x:2:2:daemon:/sbin:/sbin/Nologin
adm:x:3:4:adm:/var/adm:/Sbin/nologin
afdajdk:r>o:russia
afdajdk:ro1o:russia
...
root@arron-02:~/sed# sed '1,10s/ro\+/r/g' test.txt |head
rt:x:0:0:rt:/rt:/bin/bash
bin:x:1:1:bin:/bin:/sbin/Nologin
fahsjkfa:fsajfkl:112:afd:rao:90
daemon:x:2:2:daemon:/sbin:/sbin/Nologin
adm:x:3:4:adm:/var/adm:/Sbin/nologin
afdajdk:r>o:russia
afdajdk:r1o:russia
aaaaaa:1o:11111:BUs
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
## 如上的表达式用 -r 也可以实现
root@arron-02:~/sed# sed -r '1,10s/ro+/r/g' test.txt |head
rt:x:0:0:rt:/rt:/bin/bash
bin:x:1:1:bin:/bin:/sbin/Nologin
fahsjkfa:fsajfkl:112:afd:rao:90
daemon:x:2:2:daemon:/sbin:/sbin/Nologin
adm:x:3:4:adm:/var/adm:/Sbin/nologin
afdajdk:r>o:russia
afdajdk:r1o:russia
aaaaaa:1o:11111:BUs
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
- 替换的特殊用法,
.*
是贪婪匹配
root@arron-02:~/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
90:fsajfkl:112:afd:rao:fahsjkfa
/sbin/Nologin:x:2:2:daemon:/sbin:daemon
/Sbin/nologin:x:3:4:adm:/var/adm:adm
russia:r>o:afdajdk
russia:ro1o:afdajdk
BUs:1o:11111:aaaaaa
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
## /root 替换 123
root@arron-02:~/sed# head test.txt|sed -nr 's/\/root/123/g'p
root:x:0:0:root:123:/bin/bash
root@arron-02:~/sed# head test.txt|sed -nr 's@/root@123@g'p
root:x:0:0:root:123:/bin/bash
## 替换多串字符
root@arron-02:~/sed# head test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/Nologin
fahsjkfa:fsajfkl:112:afd:rao:90
daemon:x:2:2:daemon:/sbin:/sbin/Nologin
adm:x:3:4:adm:/var/adm:/Sbin/nologin
afdajdk:r>o:russia
afdajdk:ro1o:russia
aaaaaa:1o:11111:BUs
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
## 可以用 \ 去替换
root@arron-02:~/sed# head test.txt | sed 's/\/sbin\/nologin/123/g'I
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123
fahsjkfa:fsajfkl:112:afd:rao:90
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
afdajdk:r>o:russia
afdajdk:ro1o:russia
aaaaaa:1o:11111:BUs
lp:x:4:7:lp:/var/spool/lpd:123
sync:x:5:0:sync:/sbin:/bin/sync
## 也可以用 # 去替换, 用 @ 也可以
root@arron-02:~/sed# head test.txt | sed 's#/sbin/nologin#123#g'I
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123
fahsjkfa:fsajfkl:112:afd:rao:90
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
afdajdk:r>o:russia
afdajdk:ro1o:russia
aaaaaa:1o:11111:BUs
lp:x:4:7:lp:/var/spool/lpd:123
sync:x:5:0:sync:/sbin:/bin/sync
root@arron-02:~/sed# head test.txt|sed 's@/sbin/nologin@123@g'I
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123
fahsjkfa:fsajfkl:112:afd:rao:90
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
afdajdk:r>o:russia
afdajdk:ro1o:russia
aaaaaa:1o:11111:BUs
lp:x:4:7:lp:/var/spool/lpd:123
sync:x:5:0:sync:/sbin:/bin/sync
- [0-9a-zA-Z] 表示所有的数字和英文字母
root@arron-02:~/sed# head test.txt| sed 's/[a-zA-Z]//g'
::0:0::/://
::1:1::/://
::112:::90
::2:2::/://
::3:4:://://
:>:
:1:
:1:11111:
::4:7::///://
::5:0::/://
- 在每行的前面加上字符串, 行首可以用 & 和 \1 去表示, 他们表示第一个 / 和第二个 / 之间的内容
## 在行首加上字符或字符串
root@arron-02:~/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:fahsjkfa:fsajfkl:112:afd:rao:90
aaa:daemon:x:2:2:daemon:/sbin:/sbin/Nologin
aaa:adm:x:3:4:adm:/var/adm:/Sbin/nologin
aaa:afdajdk:r>o:russia
aaa:afdajdk:ro1o:russia
aaa:aaaaaa:1o:11111:BUs
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
## 或者用如下方式去实现
root@arron-02:~/sed# head test.txt |sed -r 's/(.*)/aaa:\1/'
aaa:root:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/sbin/Nologin
aaa:fahsjkfa:fsajfkl:112:afd:rao:90
aaa:daemon:x:2:2:daemon:/sbin:/sbin/Nologin
aaa:adm:x:3:4:adm:/var/adm:/Sbin/nologin
aaa:afdajdk:r>o:russia
aaa:afdajdk:ro1o:russia
aaa:aaaaaa:1o:11111:BUs
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
## 行尾增加字符串
root@arron-02:~/sed# head test.txt |sed -r 's/^.*$/&:aaa/'
root:x:0:0:root:/root:/bin/bash:aaa
bin:x:1:1:bin:/bin:/sbin/Nologin:aaa
fahsjkfa:fsajfkl:112:afd:rao:90:aaa
daemon:x:2:2:daemon:/sbin:/sbin/Nologin:aaa
adm:x:3:4:adm:/var/adm:/Sbin/nologin:aaa
afdajdk:r>o:russia:aaa
afdajdk:ro1o:russia:aaa
aaaaaa:1o:11111:BUs:aaa
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin:aaa
sync:x:5:0:sync:/sbin:/bin/sync:aaa
9.6/9.7 awk
AWK 工具
head -n2 test.txt|awk -F ':' '{print $1}'
head -n2 test.txt|awk -F ':' '{print $0}'
awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
awk '/oo/' test.txt
awk -F ':' '$1 ~/oo/' test.txt
awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
awk -F ':' '$3=="0"' /etc/passwd
awk -F ':' '$3>="500"' /etc/passwd
awk -F ':' '$3>=500' /etc/passwd
awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
awk -F ':' '$3<$4' /etc/passwd
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘
awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd
head -n3 /etc/passwd | awk -F ':' '{print NF}‘
head -n3 /etc/passwd | awk -F ':' '{print NR}‘
awk 'NR>40' /etc/passwd
awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
head -n 3 /etc/passwd |awk -F ':' '$1="root"‘
awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd
AWK 支持分段 ,
也不能更改文件内容,
AWK 不指定分隔符, 默认会以空格或者空白字符为分隔符,
也没有颜色显示
不需要脱意, (), {}, | , + , ? 都不需要脱意
如果需求是针对数字的, 就不要加双引号 ""
root@arron-02:~/sed# cd .. ; mkdir awk; cp /etc/passwd awk/test.txt; cd awk/; ls
test.txt
## 打印第一段
root@arron-02:~/awk# head test.txt | awk -F ':' '{print $1}'
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
root@arron-02:~/awk# head test.txt | awk -F ':' '{print $0}'
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
## 如下印证 awk 是以空格符为分隔符的
### 创建 1.txt
root@arron-02:~/awk# vim 1.txt
1 2
aa bb
dd ee
root@arron-02:~/awk# awk '{print $1}' 1.txt
1
aa
dd
1.打印多段 {print $n1, $n2, $n3, $n#}
root@arron-02:~/awk# awk -F':' '{print $1,$3,$4}' test.txt
root 0 0
bin 1 1
daemon 2 2
....
## 指定分隔符, 在段与段之间加上
root@arron-02:~/awk# awk -F':' '{print $1"#"$3"#"$4}' test.txt
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7
sync#5#0
....
- 如 sed 一样, 匹配某个字符段时要加
//
root@arron-02:~/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
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root@arron-02:~/awk# awk -F ':' '$1 ~ /oo/' test.txt
root:x:0:0:root:/root:/bin/bash
- 支持正则
root@arron-02:~/awk# awk -F ':' '$1 ~ /o+/' test.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
arron:x:1000:1000::/home/arron:/bin/bash
root@arron-02:~/awk# awk -F ':' '$1 ~ /oo+/' test.txt
root:x:0:0:root:/root:/bin/bash
- 支持多个字符, 多段打印 且不需要参数
root@arron-02:~/awk# awk -F ':' '/root/ {print $1":"$3} /user/ {print $1":"$3":"$4}' test.txt
root:0
operator:11
tss:59:59
root@arron-02:~/awk# grep -E 'root|user' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
root@arron-02:~/awk# awk -F ':' '/root|user/ {print $0}' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
- 等于 , = 相当于赋值, == 是等于,
root@arron-02:~/awk# awk -F ':' '$3==0' test.txt
root:x:0:0:root:/root:/bin/bash
root@arron-02:~/awk# awk -F ':' '$3==0 {print $1}' test.txt
root
root@arron-02:~/awk# awk -F ':' '$3>=1000 {print $1}' test.txt
arron
## 如果数字加上双引号 "", 那么就会以ASCII 码去匹配, 而不是数字
root@arron-02:~/awk# awk -F ':' '$3>="1000" {print $0}' test.txt
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:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
arron:x:1000:1000::/home/arron:/bin/bash
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
- ! 表示非
root@arron-02:~/awk# awk -F ':' '$7!="/sbin/nologin" {print $0}' 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
arron:x:1000:1000::/home/arron:/bin/bash
- 多字段大小比较
root@arron-02:~/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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
root@arron-02:~/awk# awk -F ':' '$3==$4' 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
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
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
arron:x:1000:1000::/home/arron:/bin/bash
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
7.1 多条件使用, && 表示并且, || 表示或者
## && 的使用
root@arron-02:~/awk# awk -F ':' '$3>5 && $3 <7' test.txt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
## || 的使用, 如下两例可知, 对于字符匹配, 一定要加双引号 ""
root@arron-02:~/awk# awk -F ':' '$3>500 || $7==/sbin/nologin' test.txt
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
arron:x:1000:1000::/home/arron:/bin/bash
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
root@arron-02:~/awk# awk -F ':' '$3>500 || $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
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/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
arron:x:1000:1000::/home/arron:/bin/bash
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
## 多字符匹配 // 和 "" 都可以 ?
root@arron-02:~/awk# awk -F ':' '$3>500 || $7 ~ /bash/' test.txt
root:x:0:0:root:/root:/bin/bash
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
arron:x:1000:1000::/home/arron:/bin/bash
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
root@arron-02:~/awk# awk -F ':' '$3>500 || $7 ~ "bash"' test.txt
root:x:0:0:root:/root:/bin/bash
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
arron:x:1000:1000::/home/arron:/bin/bash
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
- 内置变量 OFS 分隔符 (只能放在条件参数的前部), NR 行 , NF 段 ,
root@arron-02:~/awk# awk -F ':' '{OFS="#"} $3>500 || $7 ~ /bash/ {print $1,$3,$7}' test.txt
root#0#/bin/bash
polkitd#999#/sbin/nologin
chrony#998#/sbin/nologin
arron#1000#/bin/bash
nginx#997#/sbin/nologin
## NR 行
root@arron-02:~/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
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
......
## NF 段
root@arron-02:~/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
7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
......
## 更改源文件后再匹配
root@arron-02:~/awk# awk -F ':' '{print NF ":" $0}' test.txt
0:
6:root:x:0:0:root:/root
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
......
## 也可以设置多条件使用
root@arron-02:~/awk# awk -F ':' 'NR<10 && $1 ~ /root|sync/' test.txt
root:x:0:0:root:/root
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
root@arron-02:~/awk# awk -F ':' 'NF==6 && $1 ~ /root|sync/ {print NR":"$0}' test.txt
1:root:x:0:0:root:/root
## NR:NF 打印效果, 打印这种的原理是NR 逐行逐段递增的去匹配 NF(最大的), 当 NR 没有与 NR (永远的最大值) 相匹配时, 就会显示为空
root@arron-02:~/awk# awk -F ':' '{print NR":"NF}' test.txt
1:6
2:7
3:7
4:7
5:7
6:7
7:7
8:7
9:7
10:7
11:7
12:7
......
root@arron-02:~/awk# awk -F ':' '{print $NR":"$NF}' test.txt
root:/root
x:/bin/bash
1:/sbin/nologin
2:/sbin/nologin
adm:/sbin/nologin
/var/spool/lpd:/sbin/nologin
/bin/sync:/bin/sync
:/sbin/shutdown
:/sbin/halt
:/sbin/nologin
......
- 设置条件函数
root@arron-02:~/awk# awk -F ':' '{OFS="#"} {if ($3>500) {print $1,$3,$7}}' test.txt
polkitd#999#/sbin/nologin
chrony#998#/sbin/nologin
arron#1000#/bin/bash
nginx#997#/sbin/nologin
- 赋值 就是"="(只有一个等于号) , 等于是 "==" (两个等于号)
## 当赋值时, 段与段之间就是空白的, 这时需要用内置变量 OFS (分隔符) 来定义
root@arron-02:~/awk# head -n 3 /etc/passwd | 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
## 加 OFS=":" 分隔符
root@arron-02:~/awk# head -n 3 /etc/passwd | awk -F ':' '{OFS=":"} $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
root@arron-02:~/awk# head -n 3 /etc/passwd | awk -F ':' '$1=="root"'
root:x:0:0:root:/root:/bin/bash
- 引用函数, awk 可以直接引用函数
root@arron-02:~/awk# awk -F ':' '{(tot=tot+$3)} ; END {print tot}' test.txt
4661