正则

正则介绍

  • 正则就是一串有规律的字符串,掌握好正则对于编写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扩展

打印文件中特定的某行到某行之间的内容

例如:有个文件test的内容如下:

ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfgf

怎么能截取

[abcfd]
123
324
444
[rty]

这一部分出来呢?

答案: sed -n '/[abcfd]/,/[rty]/p' test

sed转换大小写

sed中,使用\u表示大写,\l表示小写

  1. 把每个单词的第一个小写字母变大写:
sed 's/\b[a-z]/\u&/g' filename
  1. 把所有小写变大写:
sed 's/[a-z]/\u&/g' filename
  1. 大写变小写:
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

转载于:https://my.oschina.net/u/3852961/blog/1825105

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值