正则介绍
-
正则就是一串有规律的字符串,掌握好正则对于编写shell脚本有很大帮助。各种编程语言中都有正则,原理是一样的。
grep 过滤
用法:grep -cinvABC 'word' filename
-
-c 行数
-
-i 不区分大小写
-
-n 显示行号
-
-v 取反
-
-r 遍历所有子目录
-
-A 后面跟数字,过滤出符合要求的行以及下面n行
-
-B 同上,过滤出符合要求的行以及上面n行
-
-C 同上,同时过滤出符合要求的行以及上下各n行。
[root@localhost ~]# mkdir grep
[root@localhost ~]# cd grep/
[root@localhost grep]# cp /etc/passwd .
[root@localhost grep]# ls
passwd
[root@localhost grep]# pwd
/root/grep
[root@localhost grep]# ls
passwd
[root@localhost grep]# grep 'nologin' passwd
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-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/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:997:995::/var/lib/chrony:/sbin/nologin
[root@localhost grep]#
-
grep -c 行数
[root@localhost grep]# grep -c 'nologin' passwd
17
[root@localhost grep]#
-
grep -n 行号
[root@localhost grep]# grep -n '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-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
15:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16:dbus:x:81:81:System message bus:/:/sbin/nologin
17:polkitd:x:998:996:User for polkitd:/:/sbin/nologin
18:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
19:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
21:chrony:x:997:995::/var/lib/chrony:/sbin/nologin
[root@localhost grep]#
-
grep -ni 行号,i的作用,不区分大小写
-
grep -vn 取反
[root@localhost grep]# grep -v 'nologin' passwd
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
user1:x:1000:1007::/home/user1:/bin/bash
user2:x:1001:1008::/home/user2:/bin/bash
user3:x:1005:1000::/home/user3:/bin/bash
[root@localhost grep]#
-
grep -r 可以搜到目录
[root@localhost grep]# grep -r 'root' /etc/
/etc/pki/ca-trust/ca-legacy.conf:# The upstream Mozilla.org project tests all changes to the root CA
/etc/pki/ca-trust/ca-legacy.conf:# to temporarily keep certain (legacy) root CA certificates trusted,
/etc/pki/ca-trust/ca-legacy.conf:# It may keep root CA certificate as trusted, which the upstream
/etc/pki/ca-trust/extracted/README:root CA certificates.
/etc/pki/ca-trust/extracted/java/README:root CA certificates.
匹配到二进制文件 /etc/pki/ca-trust/extracted/java/cacerts
/etc/pki/ca-trust/extracted/openssl/README:root CA certificates.
/etc/pki/ca-trust/extracted/pem/README:root CA certificates.
/etc/pki/tls/certs/make-dummy-cert: echo root@localhost.localdomain
/etc/pki/tls/openssl.cnf:dir = ./demoCA # TSA root directory
/etc/rpm/macros.perl:%define perl_br_testdir %{buildroot}%{perl_testdir}/%{cpan_dist_name} \
-
-A 后面跟数字,过滤出符合要求的行以及下面n行
[root@localhost grep]# grep -nA2 '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
--
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
[root@localhost grep]#
-
-B 同上,过滤出符合要求的行以及上面的n行
[root@localhost grep]# grep -nB2 'root' passwd
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
[root@localhost grep]#
-
-C 同上,同时过滤出符合要求的行以及上下各n行
[root@localhost grep]# grep -nC2 '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
--
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 '[0-9]' /etc/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
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-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/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:997:995::/var/lib/chrony:/sbin/nologin
user1:x:1000:1007::/home/user1:/bin/bash
user2:x:1001:1008::/home/user2:/bin/bash
user3:x:1005:1000::/home/user3:/bin/bash
如果加了-v ,意思是过滤出除了带数字的行,如下结果是没有这样的行
[root@localhost ~]# grep -v '[0-9]' /etc/passwd
[root@localhost ~]#
-
同样grep -n '^#' /etc/inittab ,是列出#号开头的行,加-v后,反向过滤
[root@localhost ~]# 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.
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
14:#
15:# To set a default target, run:
16:# systemctl set-default TARGET.target
17:#
[root@localhost ~]# grep -nv '^#' /etc/inittab
[root@localhost ~]#
-
[root@localhost ~]# grep -n '^[^0-9]' /etc/inittab
[]里面的内容是非的意思,上面的就是过滤列出一个非0-9开头的行。
-
grep -n 'r.o' passwd
r.o的.的意思是代表所有字符。
[root@localhost grep]# vi passwd
[root@localhost grep]# grep -n 'r.o' passwd
1:root:x:0:0:root:/root:/bin/bash
3:fsfh:23:rao:fsdfafsaf:fffas
11:fdsafa:r>o:ksldjflkasdjfla:qe112312
12:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost grep]#
-
grep -n 'o*o' passw
'o*o' * 号左侧的字符的n个相同字符。
[root@localhost grep]# grep -n 'o*o' passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:fsfh:23:rao:fsdfafsaf:fffas
4:daemon:x:2:2:daemon:/sbin:/sbin/nologin
5:adm:x:3:4:adm:/var/adm:/sbin/nologin
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
10:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11:fdsafa:r>o:ksldjflkasdjfla:qe112312
12:operator:x:11:0:operator:/root:/sbin/nologin
13:games:x:12:100:games:/usr/games:/sbin/nologin
14:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
15:nobody:x:99:99:Nobody:/:/sbin/nologin
16:systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
17:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
18:dbus:x:81:81:System message bus:/:/sbin/nologin
19:polkitd:x:998:996:User for polkitd:/:/sbin/nologin
20:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
21:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
22:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
23:chrony:x:997:995::/var/lib/chrony:/sbin/nologin
24:user1:x:1000:1007::/hooome/user1:/bin/bash
25:user2:x:1001:1008::/hoooome/user2:/bin/bash
26:user3:x:1005:1000::/hoome/user3:/bin/bash
[root@localhost grep]#
-
脱义符号 ,{}表示前面字符的重复范围,但是正常输入是没有的,需要脱义
[root@localhost grep]# grep 'o{2}' passwd
[root@localhost 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
user1:x:1000:1007::/hooome/user1:/bin/bash
user2:x:1001:1008::/hoooome/user2:/bin/bash
user3:x:1005:1000::/hoome/user3:/bin/bash
[root@localhost grep]#
-
也可以写成egrep 或者grep -E
[root@localhost grep]# egrep '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
user1:x:1000:1007::/hooome/user1:/bin/bash
user2:x:1001:1008::/hoooome/user2:/bin/bash
user3:x:1005:1000::/hoome/user3:/bin/bash
[root@localhost grep]# grep -E '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
user1:x:1000:1007::/hooome/user1:/bin/bash
user2:x:1001:1008::/hoooome/user2:/bin/bash
user3:x:1005:1000::/hoome/user3:/bin/bash
-
grep -n 'o+o' passwd
与 * 意思差不多, + 也是过滤 + 号前面字符的n次。但是次数时大于等于1的,必须出现一次或以及以上,下面的o至少是两个在一起的。和 * 不同, * 可以出现0次。
[root@localhost grep]# grep -n 'o+o' passwd
[root@localhost grep]# grep -n 'o\+o' passwd
1:root:x:0:0:root:/root:/bin/bash
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
10:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
12:operator:x:11:0:operator:/root:/sbin/nologin
21:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
24:user1:x:1000:1007::/hooome/user1:/bin/bash
25:user2:x:1001:1008::/hoooome/user2:/bin/bash
26:user3:x:1005:1000::/hoome/user3:/bin/bash
[root@localhost grep]# egrep -n 'o+o' passwd
1:root:x:0:0:root:/root:/bin/bash
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
10:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
12:operator:x:11:0:operator:/root:/sbin/nologin
21:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
24:user1:x:1000:1007::/hooome/user1:/bin/bash
25:user2:x:1001:1008::/hoooome/user2:/bin/bash
26:user3:x:1005:1000::/hoome/user3:/bin/bash
[root@localhost grep]#
[root@localhost grep]# egrep -n 'o+t' passwd
1:root:x:0:0:root:/root:/bin/bash
12:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost grep]# egrep -n 'o+b' passwd
15:nobody:x:99:99:Nobody:/:/sbin/nologin
[root@localhost grep]#
-
egrep 'o?t' passwd
? 的意思是?号左侧字符出现0或者1次,要么有要么没有。在linux系统中会有红色高亮显示
[root@localhost grep]# egrep -n 'o?t' passwd
1:root:x:0:0:root:/root:/bin/bash
8:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9:halt:x:7:0:halt:/sbin:/sbin/halt
12:operator:x:11:0:operator:/root:/sbin/nologin
14:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
16:systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
17:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
18:dbus:x:81:81:System message bus:/:/sbin/nologin
19:polkitd:x:998:996:User for polkitd:/:/sbin/nologin
20:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
21:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
22:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@localhost grep]#
-
egrep 'root|nologin' passwd
| 或者的意思
[root@localhost grep]# egrep 'root|nologin' 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
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-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/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:997:995::/var/lib/chrony:/sbin/nologin
[root@localhost grep]#
扩展
把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include="*.php" 'eval' /data/
sed 查找替换
sed 匹配的用法:sed -n '/root/'p test.txt
sed -n '/root/'p test.txt
[root@localhost sed]# sed -n '/root/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]#
同时也支持. *等用法 sed -n '/r.t/'p test.txt
[root@localhost 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
sed -n '/r*t/'p test.tx
[root@localhost 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-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sed -nr '/o+t/'p test.txt
-r选项类似 grep -E
[root@localhost sed]# sed -n '/o+t/'p test.txt
[root@localhost sed]#
[root@aminglinux-01 awk]# sed -nr '/o+t/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
sed打印指定的行,比如只打印第二行
[root@aminglinux-01 awk]# sed -n '2'p test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
- 打印2到5行
[root@aminglinux-01 awk]# 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
- 打印从第5行到最后一行写,sed -n '5,$'p test.txt ( $符号表示末行)
sed -e 匹配多个条件
- 比如 要打印出第一行,然后匹配bus字符串
[root@aminglinux-01 awk]# 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
awk
-
简单用法,打印以:为分割的第一段
[root@localhost awk]# awk -F ':' '{print $1}' test.txt
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-bus-proxy
systemd-network
dbus
polkitd
tss
postfix
sshd
chrony
user1
user2
user3
[root@localhost awk]#
-
打印所有列
如果没有指定分割符号,默认以空格或空白字符为分割点
[root@localhost awk]# awk '{print $0}' 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-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/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:997:995::/var/lib/chrony:/sbin/nologin
user1:x:1000:1007::/home/user1:/bin/bash
user2:x:1001:1008::/home/user2:/bin/bash
user3:x:1005:1000::/home/user3:/bin/bash
[root@localhost awk]#
-
列出多个段
[root@localhost 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
shutdown 6 0
halt 7 0
mail 8 12
operator 11 0
games 12 100
ftp 14 50
nobody 99 99
systemd-bus-proxy 999 997
systemd-network 192 192
dbus 81 81
polkitd 998 996
tss 59 59
postfix 89 89
sshd 74 74
chrony 997 995
user1 1000 1007
user2 1001 1008
user3 1005 1000
[root@localhost awk]#
-
打印出来有oo 的行
[root@localhost 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@localhost awk]#
-
只匹配第一行有oo的行
[root@localhost awk]# awk -F ':' '$1 ~ /oo/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]#
-
同样支持正则表达式
[root@localhost awk]# awk -F ':' '$1 ~ /oo+/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@localhost 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-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
[root@localhost awk]#
-
同时匹配多个需求的行
[root@localhost awk]# awk -F ':' '/root/ {print $1,$3} /user/ {print $1,$3,$4}' test.txt
root 0
operator 11
tss 59 59
user1 1000 1007
user2 1001 1008
user3 1005 1000
[root@localhost awk]#
-
匹配指定一个数字范围
==两个等于号是等于的意思,因为一个等于号会误认为是赋值
数值不能用双引号
[root@localhost awk]# awk -F ':' '$3==0' test.txt
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# awk -F ':' '$3==0 {print $1}' test.txt
root
[root@localhost awk]# awk -F ':' '$3>=1000 {print $1}' test.txt
user1
user2
user3
[root@localhost awk]# awk -F ':' '$3>=1000 {print $0}' test.txt
user1:x:1000:1007::/home/user1:/bin/bash
user2:x:1001:1008::/home/user2:/bin/bash
user3:x:1005:1000::/home/user3:/bin/bash
[root@localhost awk]#
不等于符号: !=
表示第7段没有/sbin/nologin,字符串要用""双引号
[root@localhost 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
user1:x:1000:1007::/home/user1:/bin/bash
user2:x:1001:1008::/home/user2:/bin/bash
user3:x:1005:1000::/home/user3:/bin/bash
[root@localhost awk]#
列出第三段小于第四段
[root@localhost 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
user1:x:1000:1007::/home/user1:/bin/bash
user2:x:1001:1008::/home/user2:/bin/bash
[root@localhost awk]#
列出第三段数值等于第四段
[root@localhost 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
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@localhost awk]#
列出第三段大于5小于7的字段
[root@localhost 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
匹配第三段数值大于1000或者第七段是/sbin/nologin的内容
[root@localhost 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
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-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/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:997:995::/var/lib/chrony:/sbin/nologin
user2:x:1001:1008::/home/user2:/bin/bash
user3:x:1005:1000::/home/user3:/bin/bash
[root@localhost awk]#
列出第三段大于1000或者第七段含有bash字段
[root@localhost awk]# awk -F ':' '$3>1000 || $7 ~ /bash/' test.txt
root:x:0:0:root:/root:/bin/bash
user1:x:1000:1007::/home/user1:/bin/bash
user2:x:1001:1008::/home/user2:/bin/bash
user3:x:1005:1000::/home/user3:/bin/bash
[root@localhost awk]#
-
指定分隔符
语法:{OFS=""} 条件 {打印内容}
[root@localhost awk]# awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$3,$7} ' test.txt
root#0#/bin/bash
user1#1000#/bin/bash
user2#1001#/bin/bash
user3#1005#/bin/bash
[root@localhost awk]#
-
显示行号
[root@localhost 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
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
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-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
15:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16:dbus:x:81:81:System message bus:/:/sbin/nologin
17:polkitd:x:998:996:User for polkitd:/:/sbin/nologin
18:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
19:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
21:chrony:x:997:995::/var/lib/chrony:/sbin/nologin
22:user1:x:1000:1007::/home/user1:/bin/bash
23:user2:x:1001:1008::/home/user2:/bin/bash
24:user3:x:1005:1000::/home/user3:/bin/bash
[root@localhost awk]#
-
显示段号
当然这里面都是7段,如果删除一个:,前面段数就变成了6
[root@localhost 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
7:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
7:halt:x:7:0:halt:/sbin:/sbin/halt
7:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
7:operator:x:11:0:operator:/root:/sbin/nologin
7:games:x:12:100:games:/usr/games:/sbin/nologin
7:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
7:nobody:x:99:99:Nobody:/:/sbin/nologin
7:systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
7:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
7:dbus:x:81:81:System message bus:/:/sbin/nologin
7:polkitd:x:998:996:User for polkitd:/:/sbin/nologin
7:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
7:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
7:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
7:chrony:x:997:995::/var/lib/chrony:/sbin/nologin
7:user1:x:1000:1007::/home/user1:/bin/bash
7:user2:x:1001:1008::/home/user2:/bin/bash
7:user3:x:1005:1000::/home/user3:/bin/bash
[root@localhost awk]#
-
打印前10行
[root@localhost 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
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
[root@localhost awk]#
-
在前10行里面找到第一段含有root或者sync的
[root@localhost 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
[root@localhost awk]#
grep,awk,sed扩展习题
grep,awk,sed扩展
-
打印某行到某行之间的内容 http://ask.apelearn.com/question/559
-
sed在某一行最后添加一个数字 http://ask.apelearn.com/question/288
-
删除某行到最后一行 http://ask.apelearn.com/question/213
-
打印1到100行含某个字符串的行 http://ask.apelearn.com/question/1048
-
awk 中使用外部shell变量 http://ask.apelearn.com/question/199
-
awk 合并一个文件 http://ask.apelearn.com/question/493
-
把一个文件多行连接成一行 http://ask.apelearn.com/question/266
-
awk中gsub函数的使用 http://ask.apelearn.com/question/200
-
awk 截取指定多个域为一行 http://ask.apelearn.com/question/224
-
过滤两个或多个关键词 http://ask.apelearn.com/question/198
-
用awk生成以下结构文件 http://ask.apelearn.com/question/5494
-
awk用print打印单引号 http://ask.apelearn.com/question/1738
打印文件中特定的某行到某行之间的内容
例如:有个文件test的内容如下:
ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfgf
怎么能截取
[abcfd]
123
324
444
[rty]
这一部分出来呢?
答案: sed -n '/[abcfd]/,/[rty]/p' test
sed转换大小写
sed中,使用\u表示大写,\l表示小写
- 把每个单词的第一个小写字母变大写:
sed 's/\b[a-z]/\u&/g' filename
- 把所有小写变大写:
sed 's/[a-z]/\u&/g' filename
- 大写变小写:
sed 's/[A-Z]/\l&/g' filename
sed在文件中某一行最后添加一个数字 sed 's/(^a.*)/\1 12/' test
cat test
askdj
aslkd aslkdjf3e
skdjfsdfj
sdkfjk
fsdkfjksdjfkjsdf
12sdfesdf
aslkdjfkasdjf asdlfkjaskdfj
sed 's/\(^a.*\)/\1 12/' test
askdj 12
aslkd aslkdjf3e 12
skdjfsdfj
sdkfjk
fsdkfjksdjfkjsdf
12sdfesdf
aslkdjfkasdjf asdlfkjaskdfj 12
sed删除某关键字的下一行到最后一行
[root@test200 ~]# cat test
a
b
c
d
e
f
[root@test200 ~]# sed '/c/{p;:a;N;$!ba;d}' test
a
b
c
如何使用sed打印1到100行包含某个字符串的行
sed -n '1,100{/abc/p}' 1.txt
awk 中使用外部shell变量
如:
A=44echo "ABCD" | awk -v GET_A=$A ’{print GET_A}’
说明:-v选项用于定义参数,这里表示将变量A的值赋予GET_A。
有多少个变量需要赋值,就需要多少个-v选项。与之等价的:应用于脚本中:
#! /bin/bash
sort -n filename |awk -F ':' '{print $1}'|uniq >id.txt
for id in `cat id.txt`; do
echo "[$id]"
awk -v id2=$id -F ':' '$1==id2 {print $2}' filename // 另外的方式为: awk -F ':' '$1=="'id'" {print $2}' filename
done
附件:
cat filename
1111111:13443253456
2222222:13211222122
1111111:13643543544
3333333:12341243123
2222222:12123123123
运行脚本后结果为:
[1111111]
13443253456
13643543544
[2222222]
13211222122
12123123123
[3333333]
12341243123
awk 合并一个文件
我有这样的需求,需要把两个文件中,第一列相同的行合并到同一行中。举个例子,有两个文件,内容如下
cat 1.txt
1 aa
2 bb
3 ee
4 ss
cat 2.txt
1 ab
2 cd
3 ad
4 bd
5 de
合并后的结果为:
1 ab aa
2 cd bb
3 ad ee
4 bd ss
5 de
实现的命令为:
awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 1.txt 2.txt
解释:NR表示读取的行数,FNR表示读取的当前行数
所以其实NR==FNR 就表示读取2.txt的时候。 同理NR>FNR表示读取1.txt的时候
数组a其实就相当于一个map
把一个文件多行连接成一行
应用举例:一个文件每行都有一个数字,现在需要把每行的数字用“+”连接起来。
cat a
96
1093
1855
1253
1364
1332
2308
2589
2531
1239
2164
2826
2787
2145
2617
4311
1810
2115
1235
awk '{printf ("%s+",$0)}' a; echo ""
96+1093+1855+1253+1364+1332+2308+2589+2531+1239+2164+2826+2787+2145+2617+4311+1810+2115+1235+
这里注意,最后一个是带“+”的。echo "" 的作用是换行。
另外的方法是
cat a|xargs|sed 's/ /+/g'
96+1093+1855+1253+1364+1332+2308+2589+2531+1239+2164+2826+2787+2145+2617+4311+1810+2115+1235
awk中gsub函数的使用
awk 'gsub(/www/,"abc")' /etc/passwd // passwd文件中把所有www替换为abc
awk -F ':' 'gsub(/www/,"abc",$1) {print $0}' /etc/passwd // 替换$1中的www为abc
awk 'sub(/www/,"abc")' /etc/passwd // passwd文件中把第一次出现的www替换为abc
awk 截取指定多个域为一行
for j in `seq 0 20`; do
let x=100*$j
let y=$x+1
let z=$x+100
for i in `seq $y $z` ; do
awk -v a=$i '{printf $a " "}' example.txt >>/tmp/test.txt
echo " " >>/tmp/test.txt
done
done
grep 或 egrep 或awk 过滤两个或多个关键词
grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行
egrep '123|abc' filename //用egrep同样可以实现
awk '/123|abc/' filename // awk 的实现方式
awk用print打印单引号
awk '{print "This is a '"'"'"$1} filename
解释一下:在awk中使用脱义字符\是起不到作用的,如果想打印特殊字符,只能使用'""' 这样的组合才可以。
这里自左至右为单引号 双引号 双引号 单引号其中两个单引号为一对,两个双引号为一对。想脱义$那就是'"$"' 脱义单引号那就是 '"'"'
把两个文件中相同的行合并成一行
paste filename1 filename2
这样就可以实现了。举个例子。
cat a.txt
1 2 3
4 5 6
a b c
cat b.txt
3 2 1
6 5 4
c b a
则 paste a.txt b.txt 结果为
1 2 3 3 2 1
4 5 6 6 5 4
a b c c b a
如果,你想在两个文件连接处用一个指定的字符连接,还可以用-d来指定
paste -d '+' a.txt b.txt
结果为
1 2 3+3 2 1
4 5 6+6 5 4
a b c+c b a