20180625 Task 正则 9.1 - 9.7

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 过滤字符, 带颜色显示, 如下所示

mark

C6 过滤字符, 不带颜色显示, 如下所示

mark

  1. -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

  1. -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 

  1. -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
  1. -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.
  1. -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

  1. [] 示例
## 习题演练
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
....
  1. ^ 示例
## ^# 以 # 开头的行
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 的字符, 只匹配那一个字符

mark

## 在 inittab 中再增加一串字符
11111111a333333333

结果依然一样

mark

^[^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:
&*&(*&(*&*

^ 放在[] 里头表示将 [] 里边的字符取非(不是行取非), 将 ^ 放到 [] 外头表示以 [] 里边的释义开头

  1. . 匹配任意一个字符
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
  1. * 匹配前面字符, 不论数量多少; .* 匹配了所有的字符, 甚至是空行
## 在 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
  1. {} 在正则中, 它表示一个范围
## 匹配不了数字
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


  1. 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. + 表示匹配 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

  1. ? 表示匹配零次或壹次前面字符
## 更改一行为如下所示
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
  1. | 表示或者, 也要脱意
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 不支持颜色显示

  1. -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
  1. . , * 等通配符
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

  1. 打印指定的行 (输入的数字表示行号) , 直接跟数字, 不需要 // 框定数字 , 如果是单个数字, 用 // 框定就表示打印内容中有这个数字的行
## 打印指定的行 (根据行号来写数字)
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
...
  1. -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

  1. 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 

  1. 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

  1. -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

  1. 替换 , 其功能与 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
  1. 替换的特殊用法, .* 是贪婪匹配
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
  1. [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. 在每行的前面加上字符串, 行首可以用 &\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
.... 
  1. 如 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 
  1. 支持正则
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

  1. 支持多个字符, 多段打印 且不需要参数
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

  1. 等于 , = 相当于赋值, == 是等于,
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

  1. ! 表示非
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 
  1. 多字段大小比较
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 

  1. 内置变量 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
......

  1. 设置条件函数
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
  1. 赋值 就是"="(只有一个等于号) , 等于是 "==" (两个等于号)
## 当赋值时, 段与段之间就是空白的, 这时需要用内置变量 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
  1. 引用函数, awk 可以直接引用函数
root@arron-02:~/awk# awk -F ':' '{(tot=tot+$3)} ; END {print tot}' test.txt
4661

转载于:https://my.oschina.net/u/3869385/blog/1836048

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
身份证正则表达式可以根据不同的位数进行匹配。对于15位身份证号码,正则表达式可以使用以下模式进行匹配:^[1-9]\d{5}\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])\d{3}$。对于18位身份证号码,正则表达式可以使用以下模式进行匹配:^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])\d{3}[\dXx]$。其中,^表示匹配输入的开始位置,$表示匹配输入的结束位置,\d表示匹配一个数字,[1-9]表示匹配除0以外的任意一个非零数字,[0-9]表示匹配任意一个数字,|表示或运算,()表示分组,[]表示字符集,{n}表示匹配前面的字符刚好出现n次,{n,}表示匹配前面的字符至少出现n次,{n,m}表示匹配前面的字符出现n到m次,[\dXx]表示匹配数字、大写字母X和小写字母x中的任意一个字符。所以,对于15位身份证号码,正则表达式的含义是:一位非零数字+六位数字地址码+两位数字年份+两位数字月份+两位数字日期+三位数字顺序码;对于18位身份证号码,正则表达式的含义是:一位非零数字+六位数字地址码+四位数字年份+两位数字月份+两位数字日期+三位数字顺序码+一位校验码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [15/18位身份证号码验证的正则表达式总结(详细版)](https://download.csdn.net/download/weixin_38742453/13673166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [学习正则表达式 - 18位身份证号](https://blog.csdn.net/wzy0623/article/details/130260594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值