shell正则表达式和文本处理器

一,正则表达式

正则表达式,又称正规表达式、常规表达式
使用字符串来描述、匹配一系列符合某个规则的字符串
正则表达式不只有一种,而且 LINUX 中不同的程序可能会使用不同的正则表达式,如:
工具:grep sed awk egrep
正则表达式组成
普通字符(大小写字母、数字、标点符号及一些其他符号)
元字符(在正则表达式中具有特殊意义的专用字符)

1.基础正则表达式

用于 grepsed 等工具中
常用的元字符包括:

1.1 字符匹配

a 匹配字符 ‘a’
abc 匹配字符串 ‘abc’

1.2 元字符

. 匹配除换行符以外的任意一个字符
^ 匹配字符串的开头
$ 匹配字符串的结尾
\ 转义字符,用于匹配特殊字符,如 \. 匹配一个点号

1.3 字符集

[abc] 匹配 ‘a’, ‘b’, 或 ‘c’
[a-z] 匹配所有小写字母
[^abc] 匹配除 ‘a’, ‘b’, ‘c’ 以外的任意字符

1.4 预定义字符集

\d 匹配任何数字,等价于 [0-9]
\D 匹配任何非数字字符
\w 匹配任何字母、数字或下划线,等价于 [a-zA-Z0-9_]
\W 匹配任何非字母、数字或下划线的字符
\s 匹配任何空白字符(空格、制表符等)
\S 匹配任何非空白字符

1.5 量词

* 匹配前面的子表达式零次或多次
\{n\} 匹配前面的子表达式恰好 n 次
\{n,\} 匹配前面的子表达式至少 n 次
\{n,m\} 匹配前面的子表达式至少 n 次,至多 m 次

1.6 非打印字符

\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符

2.扩展正则表达式

用于 egrepawk
为了简化整个指令,需要使用 范围更广的扩展正则表达式
常见的扩展

2.1分组和引用

() 用于分组。例如,(abc)+ 表示匹配一个或多个 ‘abc’。
\1, \2, … 用于引用之前的分组。例如,(abc)\1 表示匹配 ‘abcabc’。

2.2 选择

| 表示逻辑或。例如,abc|def 匹配 ‘abc’ 或 ‘def’。

2.3 量词

? 匹配前面的子表达式零次或一次。例如,a? 匹配零个或一个 ‘a’。
+ 匹配前面的子表达式一次或多次。例如,a+ 匹配一个或多个 ‘a’。
{n} 匹配前面的子表达式恰好 n 次。例如,a{3} 匹配 ‘aaa’。
{n,} 匹配前面的子表达式至少 n 次。例如,a{2,} 匹配 ‘aa’、‘aaa’ 等。
{n,m} 匹配前面的子表达式至少 n 次,至多 m 次。例如,a{2,4} 匹配 ‘aa’、‘aaa’ 或 ‘aaaa’。

二,文件处理器

练习文本 3.txt

# Practice Text for Regular Expressions
Jack and Jill went up the hill.
She sells seashells by the seashore.
How much wood would a woodchuck chuck if a woodchuck could chuck wood?
The quick brown fox jumps over the lazy dog.
Pack my box with five dozen liquor jugs.
1234567890 times, the rain in Spain stays mainly in the plain.
To be or not to be, that is the question.
Email: john.doe@domain.com
Phone: +1-800-555-5555
Address: 123 Main St., Anytown, USA
Website: https://www.example.com
The price is $123.45.
Item #4567 in stock.
PI=3.14159265358979323846
Escape special characters: ^ $ . * + ? ( ) [ ] { } | \ /


This line ends with a newline character.\n
Tabs are here: \t and here: \t
Mixed case: aBcDeFgHiJkLmNoPqRsTuVwXyZ
Repeated words: test test test test
Non-alphanumeric: !@#$%^&*()_+=-{}[]:;"'<>,.?/
Simple sentence: The dog barks at midnight.
Complex sentence: Although it was raining, we went for a walk.
123 Main St.
New York, NY 10001
Order ID: ORD-12345
Date: 2024-07-28
wooooood
woood
the id on

1.grep

对内容进行过滤
grep 命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用 egrep 或 awk 命令。
格式
grep [选项]… 查找条件 目标文件
常用选项
-E :开启扩展(Extend)的正则表达式
-c :计算找到 ‘搜寻字符串’ 的次数
-i :忽略大小写的不同,所以大小写视为相同
-o :只显示被模式匹配到的字符串
-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!(反向查找,输出与查找条件不相符的行)
–color=auto :可以将找到的关键词部分加上颜色的显示喔!
-n :顺便输出行号

统计root字符总行数;还可以用cat /etc/passwd | grep root
[root@localhost ~]# grep -c root /etc/passwd
22
#不区分大小写查找the所有的行
[root@localhost ~]# grep -i "the" 3.txt     
Jack and Jill went up the hill.
She sells seashells by the seashore.
The quick brown fox jumps over the lazy dog.
1234567890 times, the rain in Spain stays mainly in the plain.
To be or not to be, that is the question.
The price is $123.45.
Simple sentence: The dog barks at midnight.
the id on
#不区分大小写查找the所有的行,并显示行号
[root@localhost ~]# grep -in 'the' 3.txt
2:Jack and Jill went up the hill.
3:She sells seashells by the seashore.
5:The quick brown fox jumps over the lazy dog.
7:1234567890 times, the rain in Spain stays mainly in the plain.
8:To be or not to be, that is the question.
13:The price is $123.45.
25:Simple sentence: The dog barks at midnight.
33:the id on
将/etc/passwd里,没有出现 root 的行取出来
[root@localhost ~]# grep -v root /etc/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
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
setroubleshoot:x:995:993::/var/lib/setroubleshoot:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
chrony:x:994:990::/var/lib/chrony:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
geoclue:x:993:988:User for geoclue:/var/lib/geoclue:/sbin/nologin
sssd:x:992:987:User for sssd:/:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:991:986::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
user:x:1000:1000:USER:/home/user:/bin/bash
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
xxx:x:1001:1001::/home/xxx:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
wangwu:x:1003:1003::/home/wangwu:/bin/bash
wangwu2:x:1004:1004::/home/wangwu2:/bin/bash
wangwu3:x:1005:1005::/home/wangwu3:/bin/bash
abc:x:1006:1006::/home/abc:/bin/bash
qwe:x:1007:1007::/home/qwe:/bin/bash
plplp:x:1008:1008::/home/plplp:/bin/bash
XXK:x:1009:1009::/home/XXK:/bin/bash
fff1:x:1010:1010::/home/fff1:/bin/bash
fff2:x:1011:1011::/home/fff2:/bin/bash
fff3:x:1012:1012::/home/fff3:/bin/bash
fff4:x:1013:1013::/home/fff4:/bin/bash
fff5:x:1014:1014::/home/fff5:/bin/bash
fff6:x:1015:1015::/home/fff6:/bin/bash
fff7:x:1016:1016::/home/fff7:/bin/bash
fff8:x:1017:1017::/home/fff8:/bin/bash
fff9:x:1018:1018::/home/fff9:/bin/bash
fff10:x:1019:1019::/home/fff10:/bin/bash
UNT:x:1020:1020::/home/UNT:/bin/bash
xxxlll:x:10085:10085::/home/xxxlll:/bin/bash
testuser1:x:10086:10086::/home/testuser1:/bin/bash
testuser2:x:10087:10087::/home/testuser2:/bin/bash
user1:x:10093:10093::/home/user1:/bin/bash
user2:x:10094:10094::/home/user2:/bin/bash
user3:x:10095:10095::/home/user3:/bin/bash
fff11:x:10116:10116::/home/fff11:/bin/bash
fff12:x:10117:10117::/home/fff12:/bin/bash
fff13:x:10118:10118::/home/fff13:/bin/bash
fff14:x:10119:10119::/home/fff14:/bin/bash
fff15:x:10120:10120::/home/fff15:/bin/bash
fff16:x:10121:10121::/home/fff16:/bin/bash
fff17:x:10122:10122::/home/fff17:/bin/bash
fff18:x:10123:10123::/home/fff18:/bin/bash
fff19:x:10124:10124::/home/fff19:/bin/bash
fff20:x:10125:10125::/home/fff20:/bin/bash
f1:x:10126:10126::/home/f1:/bin/bash
f2:x:10127:10127::/home/f2:/bin/bash
f3:x:10128:10128::/home/f3:/bin/bash
f4:x:10129:10129::/home/f4:/bin/bash
f5:x:10130:10130::/home/f5:/bin/bash
f6:x:10131:10131::/home/f6:/bin/bash
f7:x:10132:10132::/home/f7:/bin/bash
f8:x:10133:10133::/home/f8:/bin/bash
f9:x:10134:10134::/home/f9:/bin/bash
f10:x:10135:10135::/home/f10:/bin/bash
f11:x:10136:10136::/home/f11:/bin/bash
f12:x:10137:10137::/home/f12:/bin/bash
f13:x:10138:10138::/home/f13:/bin/bash
f14:x:10139:10139::/home/f14:/bin/bash
f15:x:10140:10140::/home/f15:/bin/bash
f16:x:10141:10141::/home/f16:/bin/bash
f17:x:10142:10142::/home/f17:/bin/bash
f18:x:10143:10143::/home/f18:/bin/bash
f19:x:10144:10144::/home/f19:/bin/bash
f20:x:10145:10145::/home/f20:/bin/bash
fxfxfx1:x:10146:10146::/home/fxfxfx1:/bin/bash
fxfxfx2:x:10147:10147::/home/fxfxfx2:/bin/bash
fxfxfx3:x:10148:10148::/home/fxfxfx3:/bin/bash
fxfxfx4:x:10149:10149::/home/fxfxfx4:/bin/bash
fxfxfx5:x:10150:10150::/home/fxfxfx5:/bin/bash
fxfxfx6:x:10151:10151::/home/fxfxfx6:/bin/bash
fxfxfx7:x:10152:10152::/home/fxfxfx7:/bin/bash
fxfxfx8:x:10153:10153::/home/fxfxfx8:/bin/bash
fxfxfx9:x:10154:10154::/home/fxfxfx9:/bin/bash
fxfxfx10:x:10155:10155::/home/fxfxfx10:/bin/bash
fxfxfx11:x:10156:10156::/home/fxfxfx11:/bin/bash
fxfxfx12:x:10157:10157::/home/fxfxfx12:/bin/bash
fxfxfx13:x:10158:10158::/home/fxfxfx13:/bin/bash
fxfxfx14:x:10159:10159::/home/fxfxfx14:/bin/bash
fxfxfx15:x:10160:10160::/home/fxfxfx15:/bin/bash
fxfxfx16:x:10161:10161::/home/fxfxfx16:/bin/bash
fxfxfx17:x:10162:10162::/home/fxfxfx17:/bin/bash
fxfxfx18:x:10163:10163::/home/fxfxfx18:/bin/bash
fxfxfx19:x:10164:10164::/home/fxfxfx19:/bin/bash
fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash
过滤出不是the的
[root@localhost ~]# grep -vn 'the' 3.txt
1:# Practice Text for Regular Expressions
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
6:Pack my box with five dozen liquor jugs.
9:Email: john.doe@domain.com
10:Phone: +1-800-555-5555
11:Address: 123 Main St., Anytown, USA
12:Website: https://www.example.com
13:The price is $123.45.
14:Item #4567 in stock.
15:PI=3.14159265358979323846
16:Escape special characters: ^ $ . * + ? ( ) [ ] { } | \ / 
17:
18:
19:
20:This line ends with a newline character.\n
21:Tabs are here: \t and here: \t
22:Mixed case: aBcDeFgHiJkLmNoPqRsTuVwXyZ
23:Repeated words: test test test test
24:Non-alphanumeric: !@#$%^&*()_+=-{}[]:;"'<>,.?/
25:Simple sentence: The dog barks at midnight.
26:Complex sentence: Although it was raining, we went for a walk.
27:123 Main St.
28:New York, NY 10001
29:Order ID: ORD-12345
30:Date: 2024-07-28
31:wooooood
32:woood
过滤出不是空行存入4.txt
[root@localhost ~]# cat 3.txt|grep -v '^$' > 4.txt
[root@localhost ~]# cat 4.txt
# Practice Text for Regular Expressions
Jack and Jill went up the hill.
She sells seashells by the seashore.
How much wood would a woodchuck chuck if a woodchuck could chuck wood?
The quick brown fox jumps over the lazy dog.
Pack my box with five dozen liquor jugs.
1234567890 times, the rain in Spain stays mainly in the plain.
To be or not to be, that is the question.
Email: john.doe@domain.com
Phone: +1-800-555-5555
Address: 123 Main St., Anytown, USA
Website: https://www.example.com
The price is $123.45.
Item #4567 in stock.
PI=3.14159265358979323846
Escape special characters: ^ $ . * + ? ( ) [ ] { } | \ / 
This line ends with a newline character.\n
Tabs are here: \t and here: \t
Mixed case: aBcDeFgHiJkLmNoPqRsTuVwXyZ
Repeated words: test test test test
Non-alphanumeric: !@#$%^&*()_+=-{}[]:;"'<>,.?/
Simple sentence: The dog barks at midnight.
Complex sentence: Although it was raining, we went for a walk.
123 Main St.
New York, NY 10001
Order ID: ORD-12345
Date: 2024-07-28
过滤出ifconfig ens33的第一行
[root@localhost ~]# ifconfig ens33|grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"|head -1
192.168.72.20
[root@localhost ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.72.20  netmask 255.255.255.0  broadcast 192.168.72.255
        inet6 fe80::bcc8:ab8:f0b3:cdb1  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:dd:1e:55  txqueuelen 1000  (Ethernet)
        RX packets 33030  bytes 2378569 (2.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 228381  bytes 45154361 (43.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
过滤出完全由空白字符组成的所有行(或完全空白的行)
[root@localhost ~]# grep -v '^[[:space:] ]*$' 3.txt
# Practice Text for Regular Expressions
Jack and Jill went up the hill.
She sells seashells by the seashore.
How much wood would a woodchuck chuck if a woodchuck could chuck wood?
The quick brown fox jumps over the lazy dog.
Pack my box with five dozen liquor jugs.
1234567890 times, the rain in Spain stays mainly in the plain.
To be or not to be, that is the question.
Email: john.doe@domain.com
Phone: +1-800-555-5555
Address: 123 Main St., Anytown, USA
Website: https://www.example.com
The price is $123.45.
Item #4567 in stock.
PI=3.14159265358979323846
Escape special characters: ^ $ . * + ? ( ) [ ] { } | \ / 
This line ends with a newline character.\n
Tabs are here: \t and here: \t
Mixed case: aBcDeFgHiJkLmNoPqRsTuVwXyZ
Repeated words: test test test test
Non-alphanumeric: !@#$%^&*()_+=-{}[]:;"'<>,.?/
Simple sentence: The dog barks at midnight.
Complex sentence: Although it was raining, we went for a walk.
123 Main St.
New York, NY 10001
Order ID: ORD-12345
Date: 2024-07-28
wooooood
woood
the id on
过滤查找出带oo的文本
[root@localhost ~]# grep -n 'oo' 3.txt #如果查到不是w开头的可以用grep -n '[^w]oo' 3.txt
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
31:wooooood
32:woood

[root@localhost ~]# grep -n '[^w]oo' 3.txt
31:wooooood
32:woood

命令的执行结果中发现“woood”与“wooooood”也符合匹配规则,二者均包含“w”。
通过执行结果发现,符合匹配标准的字符加粗显示,结果中可知, “woood ”中加粗显示的是“ooo”,而“oo”前面的“o”是符合匹配规则的。“woooooood ”也符合匹配规则。
若查找的字符“oo”前面存在小写字母,可以使用“grep -n‘[^a-z]oo’test.txt”命令实现
过滤出字符小写
[root@localhost ~]# grep -n '^[a-z]' 3.txt
31:wooooood
32:woood
33:the id on

过滤出字符大写
[root@localhost ~]# grep -n '^[A-Z]' 3.txt
2:Jack and Jill went up the hill.
3:She sells seashells by the seashore.
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
5:The quick brown fox jumps over the lazy dog.
6:Pack my box with five dozen liquor jugs.
8:To be or not to be, that is the question.
9:Email: john.doe@domain.com
10:Phone: +1-800-555-5555
11:Address: 123 Main St., Anytown, USA
12:Website: https://www.example.com
13:The price is $123.45.
14:Item #4567 in stock.
15:PI=3.14159265358979323846
16:Escape special characters: ^ $ . * + ? ( ) [ ] { } | \ / 
20:This line ends with a newline character.\n
21:Tabs are here: \t and here: \t
22:Mixed case: aBcDeFgHiJkLmNoPqRsTuVwXyZ
23:Repeated words: test test test test
24:Non-alphanumeric: !@#$%^&*()_+=-{}[]:;"'<>,.?/
25:Simple sentence: The dog barks at midnight.
26:Complex sentence: Although it was raining, we went for a walk.
28:New York, NY 10001
29:Order ID: ORD-12345
30:Date: 2024-07-28

查询不以字母开头的行则使用“^[^a-zA-Z]”
[root@localhost ~]# grep -n '^[^a-zA-Z]' 3.txt
1:# Practice Text for Regular Expressions
7:1234567890 times, the rain in Spain stays mainly in the plain.
27:123 Main St.
过滤带数值的
[root@localhost ~]# grep -n '[0-9]' 3.txt
7:1234567890 times, the rain in Spain stays mainly in the plain.
10:Phone: +1-800-555-5555
11:Address: 123 Main St., Anytown, USA
13:The price is $123.45.
14:Item #4567 in stock.
15:PI=3.14159265358979323846
27:123 Main St.
28:New York, NY 10001
29:Order ID: ORD-12345
30:Date: 2024-07-28

[root@localhost ~]# grep -n '[0-9]\+' 3.txt
7:1234567890 times, the rain in Spain stays mainly in the plain.
10:Phone: +1-800-555-5555
11:Address: 123 Main St., Anytown, USA
13:The price is $123.45.
14:Item #4567 in stock.
15:PI=3.14159265358979323846
27:123 Main St.
28:New York, NY 10001
29:Order ID: ORD-12345
30:Date: 2024-07-28

[root@localhost ~]# grep -n '[0-9]\+ ' 3.txt
7:1234567890 times, the rain in Spain stays mainly in the plain.
11:Address: 123 Main St., Anytown, USA
14:Item #4567 in stock.
27:123 Main St.
“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]” 符号外则代表定位行首。
反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符。
例如,执行以下命令即可实现查询以小数点(.)结尾的行。
因为小数点(.)在正则表达式中也是一个元字符
所以在这里需要用转义字符“\”将具有特殊意义的字符转化成普通字符。
[root@localhost ~]# grep -n '\.$' 3.txt
2:Jack and Jill went up the hill.
3:She sells seashells by the seashore.
5:The quick brown fox jumps over the lazy dog.
6:Pack my box with five dozen liquor jugs.
7:1234567890 times, the rain in Spain stays mainly in the plain.
8:To be or not to be, that is the question.
13:The price is $123.45.
14:Item #4567 in stock.
25:Simple sentence: The dog barks at midnight.
26:Complex sentence: Although it was raining, we went for a walk.
27:123 Main St.

过滤查找以s结尾的
[root@localhost ~]# grep -n 's$' 3.txt
1:# Practice Text for Regular Expressions


错误示例
[root@localhost ~]# grep -n '.$' 3.txt
[root@localhost ~]# grep -n '.$' 3.txt
1:# Practice Text for Regular Expressions
2:Jack and Jill went up the hill.
3:She sells seashells by the seashore.
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
5:The quick brown fox jumps over the lazy dog.
6:Pack my box with five dozen liquor jugs.
7:1234567890 times, the rain in Spain stays mainly in the plain.
8:To be or not to be, that is the question.
9:Email: john.doe@domain.com
10:Phone: +1-800-555-5555
11:Address: 123 Main St., Anytown, USA
12:Website: https://www.example.com
13:The price is $123.45.
14:Item #4567 in stock.
15:PI=3.14159265358979323846
16:Escape special characters: ^ $ . * + ? ( ) [ ] { } | \ / 
20:This line ends with a newline character.\n
21:Tabs are here: \t and here: \t
22:Mixed case: aBcDeFgHiJkLmNoPqRsTuVwXyZ
23:Repeated words: test test test test
24:Non-alphanumeric: !@#$%^&*()_+=-{}[]:;"'<>,.?/
25:Simple sentence: The dog barks at midnight.
26:Complex sentence: Although it was raining, we went for a walk.
27:123 Main St.
28:New York, NY 10001
29:Order ID: ORD-12345
30:Date: 2024-07-28
31:wooooood
32:woood 
33:the id on
查找除了以the开头的
[root@localhost ~]# grep -vn '^the' 3.txt
1:# Practice Text for Regular Expressions
2:Jack and Jill went up the hill.
3:She sells seashells by the seashore.
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
5:The quick brown fox jumps over the lazy dog.
6:Pack my box with five dozen liquor jugs.
7:1234567890 times, the rain in Spain stays mainly in the plain.
8:To be or not to be, that is the question.
9:Email: john.doe@domain.com
10:Phone: +1-800-555-5555
11:Address: 123 Main St., Anytown, USA
12:Website: https://www.example.com
13:The price is $123.45.
14:Item #4567 in stock.
15:PI=3.14159265358979323846
16:Escape special characters: ^ $ . * + ? ( ) [ ] { } | \ / 
17:
18:
19:
20:This line ends with a newline character.\n
21:Tabs are here: \t and here: \t
22:Mixed case: aBcDeFgHiJkLmNoPqRsTuVwXyZ
23:Repeated words: test test test test
24:Non-alphanumeric: !@#$%^&*()_+=-{}[]:;"'<>,.?/
25:Simple sentence: The dog barks at midnight.
26:Complex sentence: Although it was raining, we went for a walk.
27:123 Main St.
28:New York, NY 10001
29:Order ID: ORD-12345
30:Date: 2024-07-28
31:wooooood
32:woood

查找以the开头的不区分大小写
[root@localhost ~]# grep -in '^the' 3.txt
5:The quick brown fox jumps over the lazy dog.
13:The price is $123.45.
33:the id on

查找任意一个字符“.”与重复字符“*”
前面提到,在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。
例如执行以下命令就可以查找“w..d”的字符串,即共有四个字符,以 w 开头 d 结尾。
[root@localhost ~]# grep -n 'w..d' 3.txt
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
23:Repeated words: test test test test

“o*”表示拥有零个(即为空字符)或大于等于一个“o”的字符,因为允许空字符
[root@localhost ~]# grep -n 'wo*d' 3.txt
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
31:wooooood
32:woood
查询以 w 开头 d 结尾,中间的字符可有可无的字符串。
[root@localhost ~]#  grep -n 'w.*d' 3.txt
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
5:The quick brown fox jumps over the lazy dog.
6:Pack my box with five dozen liquor jugs.
23:Repeated words: test test test test
31:wooooood
32:woood
查询任意数字所在行
[root@localhost ~]# grep -n '[0-9][0-9]*' 3.txt
7:1234567890 times, the rain in Spain stays mainly in the plain.
10:Phone: +1-800-555-5555
11:Address: 123 Main St., Anytown, USA
13:The price is $123.45.
14:Item #4567 in stock.
15:PI=3.14159265358979323846
27:123 Main St.
28:New York, NY 10001
29:Order ID: ORD-12345
30:Date: 2024-07-28
查找连续字符范围“{}”
限制一个范围内的重复的字符串
“{}”在 Shell 中具有特殊意义
使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。
[root@localhost ~]# grep -n 'o\{2\}' 3.txt #\{n\} 匹配前面的子表达式恰好 n 次
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
31:wooooood
32:woood


 查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串
 [root@localhost ~]# grep -n 'wo\{2,5\}d' 3.txt #\{n,m\} 匹配前面的子表达式至少 n 次,至多 m 次
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
32:woood

2.sed

2.1定义

  • 文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等。

  • 可在无交互的情况下实现相当复杂的文本处理操作

  • 广泛应用于Shell脚本,以完成自动化处理任务。

  • sed依赖于正则表达式

  • 工作原理

           先读取,在执行,然后显示
    
  • 默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

2.2sed工作原理
image.png
2.3格式
sed [选项] ‘操作’ 参数
sed [选项] -f scriptfile 参数
sed命令+选项‘定位+动作+内容’文件名
2.4常用选项
-e 或–expression=:表示用指定命令或者脚本来处理输入的文本文件。进行多次编辑
-f 或–file=:表示用指定的脚本文件来处理输入的文本文件。 指定sed文件名
-h 或–help:显示帮助。
-n、–quiet 或 silent:表示仅显示处理后的结果。 取消默认输出
-i.bak:直接编辑文本文件。 直接在源文件中修改
-r, -E 使用扩展正则表达式
-s 将多个文件视为独立文件,而不是单个连续的长文件流

“操作”用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数 的格式。n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间进行,则表示为“5, 20 动作行为”。

常见的操作包括以下几种。
a:增加,在当前行下面增加一行指定内容。
c:替换,将选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
s:替换,替换指定字符。
y:字符转换。
2.4例

1.打印输出
查看文件内容
[root@localhost ~]# sed '' /tmp/passwd|head -10
     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


自动打印p打印了一遍
[root@localhost ~]# sed "p" /tmp/passwd|head -10
     1	root:x:0:0:root:/root:/bin/bash
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     -n 选项关闭自动打印功能
[root@localhost ~]# sed -n 'p' /tmp/passwd|head -10
     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

显示行号
显示第1行
[root@localhost ~]# sed -n '1p' /tmp/passwd
     1	root:x:0:0:root:/root:/bin/bash


显示1~3行
[root@localhost ~]# sed -n '1,3p' /tmp/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

显示2行4行6行
[root@localhost ~]# sed -n '2p;4p;6p' /tmp/passwd 
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync

打印从第4行往后的三行
[root@localhost ~]# sed -n '4,+3p' /tmp/passwd 
     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

从第一行开始每隔两行打印出来
[root@localhost ~]# sed -n '1~2p' /tmp/passwd|head -10
     1	root:x:0:0:root:/root:/bin/bash
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    11	games:x:12:100:games:/usr/games:/sbin/nologin
    13	nobody:x:99:99:Nobody:/:/sbin/nologin
    15	dbus:x:81:81:System message bus:/:/sbin/nologin
    17	abrt:x:173:173::/etc/abrt:/sbin/nologin
    19	rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin

    从第二行开始每隔两行打印
[root@localhost ~]# sed -n '2~2p' /tmp/passwd|head -10
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
     8	halt:x:7:0:halt:/sbin:/sbin/halt
    10	operator:x:11:0:operator:/root:/sbin/nologin
    12	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    14	systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    16	polkitd:x:999:997:User for polkitd:/:/sbin/nologin
    18	libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
    20	colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin

从第二行开始每每三行打印出来
[root@localhost ~]# sed -n '2~3p' /tmp/passwd|head -10
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     8	halt:x:7:0:halt:/sbin:/sbin/halt
    11	games:x:12:100:games:/usr/games:/sbin/nologin
    14	systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    17	abrt:x:173:173::/etc/abrt:/sbin/nologin
    20	colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
    23	rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
    26	ntp:x:38:38::/etc/ntp:/sbin/nologin
    29	tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

打印最后一行
[root@localhost ~]# sed -n '$p' /tmp/passwd 
   139	fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash

  

打印出含有root的
[root@localhost ~]# sed -n '/root/p' /tmp/passwd 
     1	root:x:0:0:root:/root:/bin/bash
    10	operator:x:11:0:operator:/root:/sbin/nologin
    70	root1:x:10096:10096::/home/root1:/bin/bash
    71	root2:x:10097:10097::/home/root2:/bin/bash
    72	root3:x:10098:10098::/home/root3:/bin/bash
    73	root4:x:10099:10099::/home/root4:/bin/bash
    74	root5:x:10100:10100::/home/root5:/bin/bash
    75	root6:x:10101:10101::/home/root6:/bin/bash
    76	root7:x:10102:10102::/home/root7:/bin/bash
    77	root8:x:10103:10103::/home/root8:/bin/bash
    78	root9:x:10104:10104::/home/root9:/bin/bash
    79	root10:x:10105:10105::/home/root10:/bin/bash
    80	root11:x:10106:10106::/home/root11:/bin/bash
    81	root12:x:10107:10107::/home/root12:/bin/bash
    82	root13:x:10108:10108::/home/root13:/bin/bash
    83	root14:x:10109:10109::/home/root14:/bin/bash
    84	root15:x:10110:10110::/home/root15:/bin/bash
    85	root16:x:10111:10111::/home/root16:/bin/bash
    86	root17:x:10112:10112::/home/root17:/bin/bash
    87	root18:x:10113:10113::/home/root18:/bin/bash
    88	root19:x:10114:10114::/home/root19:/bin/bash
    89	root20:x:10115:10115::/home/root20:/bin/bash

打印出bash结尾的
   [root@localhost ~]# sed -n '/bash$/p' /tmp/passwd |head -10
     1	root:x:0:0:root:/root:/bin/bash
    41	user:x:1000:1000:USER:/home/user:/bin/bash
    43	xxx:x:1001:1001::/home/xxx:/bin/bash
    45	zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
    46	wangwu:x:1003:1003::/home/wangwu:/bin/bash
    47	wangwu2:x:1004:1004::/home/wangwu2:/bin/bash
    48	wangwu3:x:1005:1005::/home/wangwu3:/bin/bash
    49	abc:x:1006:1006::/home/abc:/bin/bash
    50	qwe:x:1007:1007::/home/qwe:/bin/bash
    51	plplp:x:1008:1008::/home/plplp:/bin/bash 

 匹配包含一个字母 s,后面跟着任意三个字符,最后是一个字母 x 的行 p打印
 [root@localhost ~]# sed -n '/s...x/p' /tmp/passwd 
    30	usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
    32	sssd:x:992:987:User for sssd:/:/sbin/nologin
    34	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
    38	postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    39	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    41	user:x:1000:1000:USER:/home/user:/bin/bash
    45	zhangsan:x:1002:1002::/home/zhangsan:/bin/bash

[root@localhost ~]# sed -n '/[0-9]/p' /etc/passwd|head -10
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开头的行
[root@localhost ~]# sed -n '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
root1:x:10096:10096::/home/root1:/bin/bash
root2:x:10097:10097::/home/root2:/bin/bash
root3:x:10098:10098::/home/root3:/bin/bash
root4:x:10099:10099::/home/root4:/bin/bash
root5:x:10100:10100::/home/root5:/bin/bash
root6:x:10101:10101::/home/root6:/bin/bash
root7:x:10102:10102::/home/root7:/bin/bash
root8:x:10103:10103::/home/root8:/bin/bash
root9:x:10104:10104::/home/root9:/bin/bash
root10:x:10105:10105::/home/root10:/bin/bash
root11:x:10106:10106::/home/root11:/bin/bash
root12:x:10107:10107::/home/root12:/bin/bash
root13:x:10108:10108::/home/root13:/bin/bash
root14:x:10109:10109::/home/root14:/bin/bash
root15:x:10110:10110::/home/root15:/bin/bash
root16:x:10111:10111::/home/root16:/bin/bash
root17:x:10112:10112::/home/root17:/bin/bash
root18:x:10113:10113::/home/root18:/bin/bash
root19:x:10114:10114::/home/root19:/bin/bash
root20:x:10115:10115::/home/root20:/bin/bash

查询不是第一行的打印出来
[root@localhost ~]# sed -n '1!p' /tmp/passwd|head -10
     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

    除了nologin都打印出来
    [root@localhost ~]# sed -n '/nologin/!p' /tmp/passwd |head -10
     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
    41	user:x:1000:1000:USER:/home/user:/bin/bash
    43	xxx:x:1001:1001::/home/xxx:/bin/bash
    45	zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
    46	wangwu:x:1003:1003::/home/wangwu:/bin/bash
    47	wangwu2:x:1004:1004::/home/wangwu2:/bin/bash
    48	wangwu3:x:1005:1005::/home/wangwu3:/bin/bash

找到所有包含字符串"root"的 行显示行号
[root@localhost ~]# sed -n '/root/=' /tmp/passwd |head -10
1
10
70
71
72
73
74
75
76
77




多个模式匹配用分号或者-e
[root@localhost ~]# sed -n '/root/=;/root/p' /tmp/passwd|head -10
1
     1	root:x:0:0:root:/root:/bin/bash
10
    10	operator:x:11:0:operator:/root:/sbin/nologin
70
    70	root1:x:10096:10096::/home/root1:/bin/bash
71
    71	root2:x:10097:10097::/home/root2:/bin/bash
72
    72	root3:x:10098:10098::/home/root3:/bin/bash

统计有多少行
[root@localhost ~]# sed -n '$=' /tmp/passwd 
139

统计有多少行并打印第一行
[root@localhost ~]# sed -n '$=;1p' /tmp/passwd
     1	root:x:0:0:root:/root:/bin/bash
139

查找root开头或者shutdown 开头的行
[root@localhost ~]# sed -r '/^root|^shoutdown/p' /tmp/passwd|head -10
     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

sed默认不支持扩展正则,如果要支持,需要加-r选项
[root@localhost ~]# sed -rn '/^root|^shutdown/p' /etc/passwd |head -10
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
root1:x:10096:10096::/home/root1:/bin/bash
root2:x:10097:10097::/home/root2:/bin/bash
root3:x:10098:10098::/home/root3:/bin/bash
root4:x:10099:10099::/home/root4:/bin/bash
root5:x:10100:10100::/home/root5:/bin/bash
root6:x:10101:10101::/home/root6:/bin/bash
root7:x:10102:10102::/home/root7:/bin/bash
root8:x:10103:10103::/home/root8:/bin/bash


显示df -h的第二行
[root@localhost ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   45G  9.6G   36G   22% /
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G     0  1.9G    0% /dev/shm
tmpfs                    1.9G  9.0M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                473M  170M  303M   36% /boot
tmpfs                    378M   12K  378M    1% /run/user/42
tmpfs                    378M     0  378M    0% /run/user/0
[root@localhost ~]# df -h|sed -n '2p'
/dev/mapper/centos-root   45G  9.6G   36G   22% /

2.增加内容
将hello 插入第二行
[root@localhost ~]# sed '2ihello' /tmp/passwd|head -10
     1	root:x:0:0:root:/root:/bin/bash
hello
     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

将hello1插入第四行
  hello2
[root@localhost ~]# sed '4ihell01\nhello2' /tmp/passwd|head -10
     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
hell01
hello2
     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

在当前行下插入hello3 
[root@localhost ~]# sed '1ahello3' /tmp/passwd|head -10
     1	root:x:0:0:root:/root:/bin/bash
hello3
     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

在最后一行添加hello4
[root@localhost ~]# sed '$ahello4' /tmp/passwd|tail -10
   131	fxfxfx12:x:10157:10157::/home/fxfxfx12:/bin/bash
   132	fxfxfx13:x:10158:10158::/home/fxfxfx13:/bin/bash
   133	fxfxfx14:x:10159:10159::/home/fxfxfx14:/bin/bash
   134	fxfxfx15:x:10160:10160::/home/fxfxfx15:/bin/bash
   135	fxfxfx16:x:10161:10161::/home/fxfxfx16:/bin/bash
   136	fxfxfx17:x:10162:10162::/home/fxfxfx17:/bin/bash
   137	fxfxfx18:x:10163:10163::/home/fxfxfx18:/bin/bash
   138	fxfxfx19:x:10164:10164::/home/fxfxfx19:/bin/bash
   139	fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash
hello4

在2到4行插入hello5
[root@localhost ~]# sed '2,4a hello5' /tmp/passwd|head -10
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
hello5
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello5
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
hello5
     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

在fxfxfx20的当前行插入hello6
[root@localhost ~]# sed '/fxfxfx20/a hello6' /tmp/passwd|tail -10
   131	fxfxfx12:x:10157:10157::/home/fxfxfx12:/bin/bash
   132	fxfxfx13:x:10158:10158::/home/fxfxfx13:/bin/bash
   133	fxfxfx14:x:10159:10159::/home/fxfxfx14:/bin/bash
   134	fxfxfx15:x:10160:10160::/home/fxfxfx15:/bin/bash
   135	fxfxfx16:x:10161:10161::/home/fxfxfx16:/bin/bash
   136	fxfxfx17:x:10162:10162::/home/fxfxfx17:/bin/bash
   137	fxfxfx18:x:10163:10163::/home/fxfxfx18:/bin/bash
   138	fxfxfx19:x:10164:10164::/home/fxfxfx19:/bin/bash
   139	fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash
hello6
注意:a或者i后面的所有内容都会被理解为需要添加的内容

3.删除
删除第一行
[root@localhost ~]# sed '1d' /tmp/passwd|head -10
     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


删除2到3行
[root@localhost ~]# sed '2,3d' /tmp/passwd|head -10
     1	root:x:0:0:root:/root:/bin/bash
     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

    删除nologin的
    [root@localhost ~]# sed '/nologin/d' /tmp/passwd|head -10
     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
    41	user:x:1000:1000:USER:/home/user:/bin/bash
    43	xxx:x:1001:1001::/home/xxx:/bin/bash
    45	zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
    46	wangwu:x:1003:1003::/home/wangwu:/bin/bash
    47	wangwu2:x:1004:1004::/home/wangwu2:/bin/bash
    48	wangwu3:x:1005:1005::/home/wangwu3:/bin/bash

输入空行和###开头的
[root@localhost ~]# echo '' >> /tmp/passwd 
[root@localhost ~]# echo '###' >> /tmp/passwd 
[root@localhost ~]#  cat /tmp/passwd |tail -10
   132	fxfxfx13:x:10158:10158::/home/fxfxfx13:/bin/bash
   133	fxfxfx14:x:10159:10159::/home/fxfxfx14:/bin/bash
   134	fxfxfx15:x:10160:10160::/home/fxfxfx15:/bin/bash
   135	fxfxfx16:x:10161:10161::/home/fxfxfx16:/bin/bash
   136	fxfxfx17:x:10162:10162::/home/fxfxfx17:/bin/bash
   137	fxfxfx18:x:10163:10163::/home/fxfxfx18:/bin/bash
   138	fxfxfx19:x:10164:10164::/home/fxfxfx19:/bin/bash
   139	fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash

###


删除空行
[root@localhost ~]# sed '/^$/d' /tmp/passwd |tail -10
   131	fxfxfx12:x:10157:10157::/home/fxfxfx12:/bin/bash
   132	fxfxfx13:x:10158:10158::/home/fxfxfx13:/bin/bash
   133	fxfxfx14:x:10159:10159::/home/fxfxfx14:/bin/bash
   134	fxfxfx15:x:10160:10160::/home/fxfxfx15:/bin/bash
   135	fxfxfx16:x:10161:10161::/home/fxfxfx16:/bin/bash
   136	fxfxfx17:x:10162:10162::/home/fxfxfx17:/bin/bash
   137	fxfxfx18:x:10163:10163::/home/fxfxfx18:/bin/bash
   138	fxfxfx19:x:10164:10164::/home/fxfxfx19:/bin/bash
   139	fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash
###

删除#开头的
[root@localhost ~]# sed '/^#/d' /tmp/passwd |tail -10
   131	fxfxfx12:x:10157:10157::/home/fxfxfx12:/bin/bash
   132	fxfxfx13:x:10158:10158::/home/fxfxfx13:/bin/bash
   133	fxfxfx14:x:10159:10159::/home/fxfxfx14:/bin/bash
   134	fxfxfx15:x:10160:10160::/home/fxfxfx15:/bin/bash
   135	fxfxfx16:x:10161:10161::/home/fxfxfx16:/bin/bash
   136	fxfxfx17:x:10162:10162::/home/fxfxfx17:/bin/bash
   137	fxfxfx18:x:10163:10163::/home/fxfxfx18:/bin/bash
   138	fxfxfx19:x:10164:10164::/home/fxfxfx19:/bin/bash
   139	fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash


删除#开头的和空行
[root@localhost ~]# sed '/^$/d;/^#/d' /tmp/passwd |tail -10
   130	fxfxfx11:x:10156:10156::/home/fxfxfx11:/bin/bash
   131	fxfxfx12:x:10157:10157::/home/fxfxfx12:/bin/bash
   132	fxfxfx13:x:10158:10158::/home/fxfxfx13:/bin/bash
   133	fxfxfx14:x:10159:10159::/home/fxfxfx14:/bin/bash
   134	fxfxfx15:x:10160:10160::/home/fxfxfx15:/bin/bash
   135	fxfxfx16:x:10161:10161::/home/fxfxfx16:/bin/bash
   136	fxfxfx17:x:10162:10162::/home/fxfxfx17:/bin/bash
   137	fxfxfx18:x:10163:10163::/home/fxfxfx18:/bin/bash
   138	fxfxfx19:x:10164:10164::/home/fxfxfx19:/bin/bash
   139	fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash

4.替换
s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
I,i 忽略大小写
c 用于替换匹配的行或范围内的行

将root开头的改成yyyy
[root@localhost ~]# sed '/^root/cyyyy' /etc/passwd|head -10
yyyy
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的换成yy1
[root@localhost ~]# sed '/root/cyy1' /etc/passwd|head -10
yy1
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
yy1
games:x:12:100:games:/usr/games:/sbin/nologin


所有行换成yy2
[root@localhost ~]# sed 'cyy2' /etc/passwd|head -10
yy2
yy2
yy2
yy2
yy2
yy2
yy2
yy2
yy2
yy2

以上没有真的改变内容,只是将结果输出显示,未修改
选项i对原文件进行备份
[root@localhost ~]# sed -i.bak 'p' /etc/hosts
[root@localhost ~]# vim /etc/hosts
[root@localhost ~]# vim /etc/h
host.conf    hosts        hosts.bak    hp/          
hostname     hosts.allow  hosts.deny   httpd/

把root替换成大写ROOT全局替换并显示出来,内容太多就选个10行看看
[root@localhost ~]# sed -n 's/root/ROOT/gp' /tmp/passwd|head -10
     1	ROOT:x:0:0:ROOT:/ROOT:/bin/bash
    10	operator:x:11:0:operator:/ROOT:/sbin/nologin
    70	ROOT1:x:10096:10096::/home/ROOT1:/bin/bash
    71	ROOT2:x:10097:10097::/home/ROOT2:/bin/bash
    72	ROOT3:x:10098:10098::/home/ROOT3:/bin/bash
    73	ROOT4:x:10099:10099::/home/ROOT4:/bin/bash
    74	ROOT5:x:10100:10100::/home/ROOT5:/bin/bash
    75	ROOT6:x:10101:10101::/home/ROOT6:/bin/bash
    76	ROOT7:x:10102:10102::/home/ROOT7:/bin/bash
    77	ROOT8:x:10103:10103::/home/ROOT8:/bin/bash

查找o并替换掉字符串中第二个o为大写O
[root@localhost ~]# sed -n 's/root/ROOT/gp' /tmp/passwd|head -10
     1	ROOT:x:0:0:ROOT:/ROOT:/bin/bash
    10	operator:x:11:0:operator:/ROOT:/sbin/nologin
    70	ROOT1:x:10096:10096::/home/ROOT1:/bin/bash
    71	ROOT2:x:10097:10097::/home/ROOT2:/bin/bash
    72	ROOT3:x:10098:10098::/home/ROOT3:/bin/bash
    73	ROOT4:x:10099:10099::/home/ROOT4:/bin/bash
    74	ROOT5:x:10100:10100::/home/ROOT5:/bin/bash
    75	ROOT6:x:10101:10101::/home/ROOT6:/bin/bash
    76	ROOT7:x:10102:10102::/home/ROOT7:/bin/bash
    77	ROOT8:x:10103:10103::/home/ROOT8:/bin/bash

将全局的root替换成空格
[root@localhost ~]# sed -n 's/root/ROOT/gp' /tmp/passwd|head -10
     1	ROOT:x:0:0:ROOT:/ROOT:/bin/bash
    10	operator:x:11:0:operator:/ROOT:/sbin/nologin
    70	ROOT1:x:10096:10096::/home/ROOT1:/bin/bash
    71	ROOT2:x:10097:10097::/home/ROOT2:/bin/bash
    72	ROOT3:x:10098:10098::/home/ROOT3:/bin/bash
    73	ROOT4:x:10099:10099::/home/ROOT4:/bin/bash
    74	ROOT5:x:10100:10100::/home/ROOT5:/bin/bash
    75	ROOT6:x:10101:10101::/home/ROOT6:/bin/bash
    76	ROOT7:x:10102:10102::/home/ROOT7:/bin/bash
    77	ROOT8:x:10103:10103::/home/ROOT8:/bin/bash

将/sbin/nologin替换成yy3
[root@localhost ~]# sed -n 's/\/sbin\/nologin/yy3/gp' /tmp/passwd |head -10
     2	bin:x:1:1:bin:/bin:yy3
     3	daemon:x:2:2:daemon:/sbin:yy3
     4	adm:x:3:4:adm:/var/adm:yy3
     5	lp:x:4:7:lp:/var/spool/lpd:yy3
     9	mail:x:8:12:mail:/var/spool/mail:yy3
    10	operator:x:11:0:operator:/root:yy3
    11	games:x:12:100:games:/usr/games:yy3
    12	ftp:x:14:50:FTP User:/var/ftp:yy3
    13	nobody:x:99:99:Nobody:/:yy3
    14	systemd-network:x:192:192:systemd Network Management:/:yy3

以sync开头的行并且前面加#号,要把搜索的字符写成&就会被保留不会一起替换
[root@localhost ~]# sed -n 's/^sync/#&/gp' /etc/passwd 
#sync:x:5:0:sync:/sbin:/bin/sync

忽略大小写替换
[root@localhost ~]# sed -n 's/network/ooooo/igp' /tmp/passwd 
    14	systemd-ooooo:x:192:192:systemd ooooo Management:/:/sbin/nologin

修改SELinux 配置文件
[root@localhost ~]# sed -i.bak 's/SELINUX=disabled/SELINUX=enable/' /etc/selinux/config
[root@localhost ~]# vim /etc/selinux/config

修改selinux配置文件
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enable
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

[root@localhost ~]# sed -i.bak 's/SELINUX=enable/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

6.插入数据
在/tmp/passwd/的第三行插入/etc/hosts/的内容
[root@localhost ~]# sed '3r /etc/hosts' /tmp/passwd|head -10
     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
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
     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

在最后一行插入
[root@localhost ~]# sed '$r /etc/hosts' /tmp/passwd|tail -10
   133	fxfxfx14:x:10159:10159::/home/fxfxfx14:/bin/bash
   134	fxfxfx15:x:10160:10160::/home/fxfxfx15:/bin/bash
   135	fxfxfx16:x:10161:10161::/home/fxfxfx16:/bin/bash
   136	fxfxfx17:x:10162:10162::/home/fxfxfx17:/bin/bash
   137	fxfxfx18:x:10163:10163::/home/fxfxfx18:/bin/bash
   138	fxfxfx19:x:10164:10164::/home/fxfxfx19:/bin/bash
   139	fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash

7.另存为
使用w指令将当前编辑的文件内容另存到其他文件中,如果目标文件已存在,则会将目标文件的内容覆盖
[root@localhost ~]# sed 'w /tmp/hosts' /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

将/etc/hosts另存到/etc/hosts/第一行
[root@localhost ~]# sed '1w /tmp/hosts' /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

8.同时编辑
分别打印出第一行和第三行
[root@localhost ~]# sed -n -e '1p' -e '3p' /tmp/passwd
     1	root:x:0:0:root:/root:/bin/bash
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin

分别打印七行和九行
[root@localhost ~]# sed -ne '7p' -ne '9p' /tmp/passwd
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

9.分组
将一对数据多次操作使用{}分组
[root@localhost ~]# sed '/root/{s/root/ROOT/;s/x/X/g}' /tmp/passwd|head -10
     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

[root@localhost ~]# sed -ne '/root/{s/root/ROOT/;s/x/X/g}' -ne '1,10p' /tmp/passwd|head -10
     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

将输出的字符串分三组,只读取第一组
 s//代表查找替换 ()代表分组 \1 代表留下的组 r:读取指定文件;
[root@localhost ~]# echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\1/'
123

提取 ens33 网卡的 IP 地址
[root@localhost ~]# ifconfig ens33|sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'
192.168.72.20
[root@localhost ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.72.20  netmask 255.255.255.0  broadcast 192.168.72.255
        inet6 fe80::bcc8:ab8:f0b3:cdb1  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:dd:1e:55  txqueuelen 1000  (Ethernet)
        RX packets 76307  bytes 5906486 (5.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 243209  bytes 47169479 (44.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

10.读取完退出
[root@localhost ~]# sed '3q' /tmp/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


11.脚本
常用参数
H:复制到剪贴板;
g、G:将剪贴板中的数据覆盖/追加至指定行;
w:保存为文件;
r:读取指定文件;
a:追加指定内容。具体操作方法如下所示。
I,i 忽略大小写

例
[root@localhost ~]#sed '/the/{H;d};$G' test.txt
##将包含the 的行迁移至文件末尾,{;}用于多个操作
[root@localhost ~]#sed '1,5{H;d};17G' test.txt
##将第 1~5 行内容转移至第 17 行后
[root@localhost ~]# sed '1,5{H;d};16G' test.txt
##将第 1~5 行内容转移至第 16 行后
[root@localhost ~]# vi opt.list
1,5H
1,5d
16G
[root@localhost ~]# sed -f opt.list test.txt
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood # #woooooood # AxyzxyzxyzxyzC
I bet this place is really spooky late at night! Misfortunes never come
alone/single.
I shouldn't have lett so tast.
he was short and fat.
He was wearing a blue polo shirt with black pants. The home of Football on BBC
Sport online.


[root@server ~]# vim test.sh
#!/bin/sed -f
s/root/ROOT/g
s/^#//g
s/\/sbin\/nologin/cyyy/g
[root@localhost ~]#chmod +x test.sh
[root@localhost ~]#./test.sh passwd
[root@localhost ~]# ./test.sh /tmp/passwd
     1	ROOT:x:0:0:ROOT:/ROOT:/bin/bash
     2	bin:x:1:1:bin:/bin:cyyy
     3	daemon:x:2:2:daemon:/sbin:cyyy
     4	adm:x:3:4:adm:/var/adm:cyyy
     5	lp:x:4:7:lp:/var/spool/lpd:cyyy
     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:cyyy
    10	operator:x:11:0:operator:/ROOT:cyyy


#!/bin/sed -f
1c hello world
2{
p
s/b/B/
}
/root/{
s/x/H/
s/root/ROOT/
}


注意:
sed脚本文件第一行要声明#!/bin/sed -f
不要加单引号
每行的最后不能有空格等多余字符
#号开头为注释
一行有多个命令时用分号隔开
sed的返回值一般情况为0,不管是不是修改成功了,除非是语法错误
所以sed的返回值$?一般不作为sed成功的判断条件


12.sed高级用法
-r匹配正则
[root@localhost ~]# sed -r s/^[\t]*/#/ /etc/hosts.bak
# 127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

结合变量使用
[root@localhost ~]# word=1111 #定义一个变量
[root@localhost ~]# sed '1a$word' /etc/hosts #想在第一行后面增加一行变量的内容,但
单引号是强引用
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
$word
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost ~]# sed "1a$word" /etc/hosts #改成双引号就可以了
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
1111
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost ~]# sed '1a'"$word" /etc/hosts #或者也可以各用各的符号
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
1111
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost ~]# sed 1a$word /etc/hosts #不用也可以
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
1111
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost ~]# sed '$a'"$word" /etc/hosts #但是如果遇到想在最后一行后面添加的话
就不能用双引号或者不用符号
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
1111
[root@localhost ~]# sed "\$a$word" /etc/hosts #如果要用双引号必须用转义符
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
1111


sed 操作文件示例
 1.需求:需要将ens33网络接口的IP地址修改为 192.168.10.100
sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network-nescripts/ifcfg-ens33
2.需求:需要将 Apache 的监听地址修改为 192.168.10.100,端口修改为 8080
# 修改监听地址
sudo sed -i 's/^Listen .*/Listen 192.168.10.100:8080/'
/etc/httpd/conf/httpd.conf
# 修改 ServerName
sed -i 's/^ServerName .*/ServerName 192.168.10.100:8080/'
/etc/httpd/conf/httpd.conf
编写一个脚本,用来调整 vsftpd 服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)。
3. 脚本
[root@lo calhost ~]# vim local_only_ftp.sh
#!/bin/bash
# 指定样本文件路径、配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf "
CONFIG="/etc/vsftpd/vsftpd.conf"
# 备份原来的在, 若不存在则使用 cp 命令进行配置文件,检测文件名为/etc/vsftpd/vsftpd.conf.bak
备份文件是否存文件备份
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak # 基于样本配置进行调整,覆盖现有文件
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG
# 启动vsftpd 服务,并设为开机后自动运行
systemctl restart vsftpd
systemctl enable vsftpd
[root@localhost ~]# chmod +x local_only_ftp.sh

3.egredp

格式
egrep [选项]… 查找条件 目标文件
常用选项
同grep

+	作用:重复一个或者一个以上的前一个字符
[root@localhost ~]# egrep -n 'wo+d' 3.txt
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
31:wooooood
32:woood
?	作用:零个或者一个的前一个字符,查询“wood”“would”“woodchuck”“words”这4个字符串
[root@localhost ~]# egrep -n 'woo?' 3.txt
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
23:Repeated words: test test test test
31:wooooood
32:woood
|	作用:使用或者(or)的方式找出多个字符
可查询"of"或者"if"或者"on"字符串
[root@localhost ~]# egrep -n 'of|is|on' 3.txt
1:# Practice Text for Regular Expressions
8:To be or not to be, that is the question.
10:Phone: +1-800-555-5555
13:The price is $123.45.
20:This line ends with a newline character.\n
()	作用:查找“组”字符串,于“()”符号当中,并以“|”分隔,即可查询"She"或者"the"字符串用[]也可以
[root@localhost ~]# egrep -n '(S|t)he' 3.txt
2:Jack and Jill went up the hill.
3:She sells seashells by the seashore.
5:The quick brown fox jumps over the lazy dog.
7:1234567890 times, the rain in Spain stays mainly in the plain.
8:To be or not to be, that is the question.
[]作用 ,过滤查找S或者t的和()加|产生的效果一样
[root@localhost ~]# egrep -n '[St]he' 3.txt
2:Jack and Jill went up the hill.
3:She sells seashells by the seashore.
5:The quick brown fox jumps over the lazy dog.
7:1234567890 times, the rain in Spain stays mainly in the plain.
()+	作用:辨别多个重复的组
egrep -n 'w(o)+d' test.txt”。该命令是查询开头的"w"结尾是"d",中间有一个以上的"o"字符串
[root@localhost ~]# egrep -n 'w(o)+d' 3.txt
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?
31:wooooood
32:woood
[root@localhost ~]# egrep -v '^$|^#' 3.txt 或者grep -v '^$' 3.txt|grep -v '^#'
# egrep只用了一条命令,grep用了两条
Jack and Jill went up the hill.
She sells seashells by the seashore.
How much wood would a woodchuck chuck if a woodchuck could chuck wood?
The quick brown fox jumps over the lazy dog.
Pack my box with five dozen liquor jugs.
1234567890 times, the rain in Spain stays mainly in the plain.
To be or not to be, that is the question.
Email: john.doe@domain.com
Phone: +1-800-555-5555
Address: 123 Main St., Anytown, USA
Website: https://www.example.com
The price is $123.45.
Item #4567 in stock.
PI=3.14159265358979323846
Escape special characters: ^ $ . * + ? ( ) [ ] { } | \ / 
This line ends with a newline character.\n
Tabs are here: \t and here: \t
Mixed case: aBcDeFgHiJkLmNoPqRsTuVwXyZ
Repeated words: test test test test
Non-alphanumeric: !@#$%^&*()_+=-{}[]:;"'<>,.?/
Simple sentence: The dog barks at midnight.
Complex sentence: Although it was raining, we went for a walk.
123 Main St.
New York, NY 10001
Order ID: ORD-12345
Date: 2024-07-28
wooooood
woood
过滤出3个o
[root@localhost ~]# egrep -n 'wo{3}d' 3.txt
32:woood

过滤出2个o
[root@localhost ~]# egrep -n 'wo{2}d' 3.txt  #\{n\} 匹配前面的子表达式恰好 n 次
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?

过滤出2到3个o
[root@localhost ~]# egrep -n 'wo{2,3}d' 3.txt #{n,m}匹配前面的子表达式至少 n 次,至多 m 次
4:How much wood would a woodchuck chuck if a woodchuck could chuck wood?

4.awk

是一种处理文本文件的语言,是一个强大的文本分析工具。 它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作 数据可以来自标准输入也可以是管道或文件 ,是一个无交互的情况下实现复杂的文本操作

4.1awk版本

** AWK**:原先来源于 AT & T 实验室的的AWK
NAWK:New awk,AT & T 实验室的AWK的升级版 GAWK:即GNU AWK。所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容

[root@localhost ~]# ll `which awk`
lrwxrwxrwx. 1 root root 4 6月   7 18:20 /usr/bin/awk -> gawk

4.2工作原理

awk是一个流编辑器,主要用于对一整行进行处理。处理好一行后再处理下一行,它可以在文本中执行查找、替换、删除、插入等操作。sed 命令在处理文本时,默认不会修改源文件,而是将结果输出到标准输出。可以使用 -i 选项直接修改源文件。
sed命令常用于一整行的处理,而awk比较、倾向于将一行分成多个"“字段"然后再进行处理。awk 信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过 程中,可以使用逻辑操作符” &&“表示"与”、“||表示"或”、"!“表示非”;还可以进行简单的数学运算,如+、 一、*、/、%、^分别表示加、减、乘、除、取余和乘方。

4.3工作流程

BEGIN 阶段
执行一次。
适用于初始化设置,如字段分隔符、变量初始化等。
处理每一行输入数据
awk 从输入文件中逐行读取数据。
对于每一行,依次检查每个模式,匹配则执行对应的动作。
如果没有指定模式,默认匹配所有行。
END 阶段
执行一次。
适用于总结统计结果、打印汇总信息等。
awk 语句都是由模式和动作组成,pattern模式 和process 处理
一个 awk 脚本可以有多个语句。模式决定动作语句的触发条件 和触发时间。

4.4运行模式

正则表达式 : /root/ 匹配含有 root 的行 /*.root/
关系表达式: < > && || + *
匹配表达式: ~ !~ 动作: 变量 命令 内置函数 流控制语句它的语法结构如下:
image.png
BEGIN END 是 AWK 的关键字部,因此大写;这两个部分开始块和结束块是可选的

4.5执行流程

BEGIN 语句设置计数和打印头部信息,在所有动作之前进行
END 语句输出统计的结果,完成动作之后再执行 AWK执行的流程:读(Read)、执行(Execute)与重复(Repeat)。
AWK的工作流程图
image.png
开始块(BEGIN block) **
开始模块是在程序启动的时候执行的代码部分,整个过程中只执行一次。一般情况 下,在开始块中初始化一些变量。BEGIN是AWK的关键字,因此它必须是大写的。开始块部 分是可选的,程序可以没有开始块部分。
** 主体块(Body Block)

对每一个输入的行,都执行一次主体部分的命令。默认情况下,对输入的每一行,AWK都会执行 命令。注意:在主体块部分,没有关键字。
** 结束块(END Block)**
是在程序结束时执行的代码。END是AWK的关键字,必须大写。与开始块相似,结束块也是可 选的
awk三个步骤
1、读(Read):从文件、管道或标准输入中读入一行然后把它存放到内存中
2、执行(Execute):对每一行数据,根据 AWK 命令按顺序执行。默认是处理每一行数据,可以指定模式
3、重复(Repeat):重复上述两个过程直到文件结束

4.6格式

awk 选项’ 模式或条件{操作}’ 文件1 文件2 …
awk -f 脚本文件 文件1 文件2 … 格式:
awk关键字 选项 命令部分 ‘{xxxx}’ 文件名
awk变量
内建变量(直接使用)
自定义变量
内置变量(预定义变量)
FS:指定每行文本的字段分隔符,默认为空格或制表位。
NF:当前处理的行的字段个数。在执行过程中对应于当前的字段数,NF:列的个数
NR:当前处理的行的行号(序数)。 在执行过程中对应于当前的行号
$0:当前处理的行的整行内容。
$n:当前处理行的第 n 个字段(第 n 列)。比如: $1 表示第一个字段,$2 表示第二个字段
FILENAME:被处理的文件名(当前输入文件的名)。
FNR 各文件分别计数的行号 OFS 输出字段分隔符(默认值是一个空格)
ORS 输出记录分隔符(默认值是一个换行符)
RS:行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录, 而awk一次仅读 入一条记录,以进行处理。数据记录分隔,默认为\n,每行为一条记录
image.png

1.内建变量

awk 包含几个特殊的内建变量(可直接用):
FS:指定每行文本的字段分隔符,默认为空格或制表位。
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第 n 个字段(第 n 列)。
FILENAME:被处理的文件名。 RS:行分隔符。
awk从文件上读取时,将根据Rs的定义把读取的切割成许多条记录, 而awk一次仅读入一 条记录,以进行处理。值是" \n’ ,数据记录分隔,默认为\n,每行为一条记录

[root@localhost ~]# awk '{print}'
1
1
2
2
3
3
^Z
[2]+  已停止               awk '{print}'
[root@localhost ~]# awk '{print "abc def"}'

abc def

abc def

abc def

abc def
^C
[root@localhost ~]# awk '{print "abc def"}' < /etc/passwd
abc def
abc def
abc def
abc def
abc def
abc def
abc def
abc def
abc def
abc def
abc def

打印第一列
[root@localhost ~]# awk '{print $1}' /tmp/passwd|head -10 
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
因为没有空行默认把整个行当成一列

打印以“:”作为分隔的第3列
[root@localhost ~]# awk -F: '{print $3}' /tmp/passwd|head -10 
0
1
2
3
4
5
6
7
8
11

以“/”作为分隔符打印第一列
[root@localhost ~]# awk -F"/" '{print $1}' /tmp/passwd |head -10
root:x:0:0:root:
bin:x:1:1:bin:
daemon:x:2:2:daemon:
adm:x:3:4:adm:
lp:x:4:7:lp:
sync:x:5:0:sync:
shutdown:x:6:0:shutdown:
halt:x:7:0:halt:
mail:x:8:12:mail:
operator:x:11:0:operator:

打印多列
[root@localhost ~]# awk -F":" '{print $1,$3}' /tmp/passwd |head -10
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11

打印出空格需要双引号引出来
[root@localhost ~]# awk -F: '{print $1""$2}' /tmp/passwd |head -10
rootx
binx
daemonx
admx
lpx
syncx
shutdownx
haltx
mailx
operatorx

用[]引用两个符号,:或 /作为分隔符号打印出来
root@localhost ~]# awk -F[:/] '{print $9}' /tmp/passwd|head -10 
bin
sbin
sbin

lpd
bin
sbin
sbin
mail
sbin



2.内置变量

awk常用内置变量
$1:代表第一列
$2:代表第二列以此类推
$0:代表整行
NF:一行的列数
NR:行数
FS:输入字段的分隔符 默认是空格
OFS:输出字段的分隔符 默认也是空格
FNR:读取文件的记录数(行号),从1开始,新的文件重新重1开始计数
RS:输入行分隔符 默认为换行符
ORS:输出行分隔符 默认也是为换行符

打印出含root的整行
[root@localhost ~]# awk -F: '{print $0}' /tmp/passwd|head -10
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的第一列
[root@localhost ~]# awk -F: '{print $1}' /tmp/passwd|head -10 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

打印出含root的第一列和第六列
[root@localhost ~]# awk -F: '/root/{print $1,$6}' /tmp/passwd |head -10
root /root
operator /root
root1 /home/root1
root2 /home/root2
root3 /home/root3
root4 /home/root4
root5 /home/root5
root6 /home/root6
root7 /home/root7
root8 /home/root8

打印出每一行的几列
[root@localhost ~]# awk -F[:/] '{print NF}' /tmp/passwd |head -10
10
10
10
11
12
10
10
10
12
10

打印出行号就打开头10 行
[root@localhost ~]# awk -F[:/] '{print NR}' /tmp/passwd|head -10
1
2
3
4
5
6
7
8
9
10


打印出第5行
[root@localhost ~]# awk 'NR==5' /tmp/passwd 或者awk 'NR==5{print}' /tmp/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

打印第6行第5列
[root@localhost ~]# awk -F[:/] 'NR==6{print $5}' /tmp/passwd 
sync

打印出每行最后一列
[root@localhost ~]# awk -F[:/] '{print $NF}' /tmp/passwd|head -10 
bash
nologin
nologin
nologin
nologin
sync
shutdown
halt
nologin
nologin

打印出总行数
[root@localhost ~]# awk 'END{print NR}' /tmp/passwd
139

打印出最后一行
[root@localhost ~]# awk 'END{print $0}' /tmp/passwd 
fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash

打印出当前几列
[root@localhost ~]# awk -F: '{print "当前有"NF"列"}' /tmp/passwd|head -10当前有7列
当前有7列
当前有7列
当前有7列
当前有7列
当前有7列
当前有7列
当前有7列
当前有7列
当前有7列

打印出第几行有几列
[root@localhost ~]# awk -F: '{print "第"NR"有"NF"列"}' /tmp/passwd|head -10
第1有7列
第2有7列
第3有7列
第4有7列
第5有7列
第6有7列
第7有7列
第8有7列
第9有7列
第10有7列

打印出本机的ip
[root@localhost ~]# ifconfig ens33|awk '/netmask/{print "本机的ip地址是"$2}'
本机的ip地址是192.168.72.20

打印出本机接收的流量
[root@localhost ~]# ifconfig ens33|awk '/RX p/{print $5"字节"}' 
5709489字节

打印出根分区可用量
[root@localhost ~]# df -h|awk 'NR==2{print $4}'
36G

FS
[root@localhost ~]# awk 'BEGIN{FS=":"}{print $1}' /tmp/passwd |head -10
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

OFS      将:换成---分隔打印出第一和第二列
[root@localhost ~]# awk 'BEGIN{FS=":";OFS="---"}{print $1,$2}' /tmp/passwd |head -10
root---x
bin---x
daemon---x
adm---x
lp---x
sync---x
shutdown---x
halt---x
mail---x
operator---x

FNR
[root@localhost ~]# awk '{print FNR,$0}' /etc/resolv.conf /etc/hosts 
1 # Generated by NetworkManager
2 nameserver 8.8.8.8
3 nameserver 61.147.37.1
1 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
2 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

RS    用RS指定什么为换行符号打印出来
[root@localhost ~]# awk 'BEGIN{RS=":"}{print $0}' /tmp/passwd|head -5
root
x
0
0
root

ORS       把多行中以空间做分隔符的输出的时候作为一行
awk 'BEGIN{ORS=" "}{print $0}' /tmp/passwd
3.BEGIN END运算

逐行执行开始之前执行什么任务,结束之后再执行什么任务,用BEGIN、END BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次 END一般用来做汇总操作,仅在读取完数据记录之后执行一次

运算
[root@localhost ~]# awk 'BEGIN{x=10;print x}'
10

[root@localhost ~]# awk 'BEGIN{x=10;print x+2}'
12

[root@localhost ~]# awk 'BEGIN{x=10;x++;print x}'
11

[root@localhost ~]# awk 'BEGIN{x=10;x++;print x+3}'  没有设置循环的情况下只运行一次x++
14

[root@localhost ~]# awk 'BEGIN{print x+1}'  不设定初始值默认为0
1

[root@localhost ~]# awk 'BEGIN{print 2.3+3.6}'  可以小数运算
5.9

[root@localhost ~]# awk 'BEGIN{print 2.3+3.6}'
5.9

[root@localhost ~]# awk 'BEGIN{print 6-1}'
5

[root@localhost ~]# awk 'BEGIN{print 3*6}'
18

[root@localhost ~]# awk 'BEGIN{print 2**2}' 次方运算
4

[root@localhost ~]# awk 'BEGIN{print 1/2}'
0.5

打印出含有root模糊匹配就打印出10行看看
[root@localhost ~]# awk -F: '/root/' /tmp/passwd|head -10
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
root1:x:10096:10096::/home/root1:/bin/bash
root2:x:10097:10097::/home/root2:/bin/bash
root3:x:10098:10098::/home/root3:/bin/bash
root4:x:10099:10099::/home/root4:/bin/bash
root5:x:10100:10100::/home/root5:/bin/bash
root6:x:10101:10101::/home/root6:/bin/bash
root7:x:10102:10102::/home/root7:/bin/bash
root8:x:10103:10103::/home/root8:/bin/bash

模糊匹配用~表示包含root的 !表示不包含
[root@localhost ~]# awk -F: '$1~/root/' /tmp/passwd|head -10
root:x:0:0:root:/root:/bin/bash
root1:x:10096:10096::/home/root1:/bin/bash
root2:x:10097:10097::/home/root2:/bin/bash
root3:x:10098:10098::/home/root3:/bin/bash
root4:x:10099:10099::/home/root4:/bin/bash
root5:x:10100:10100::/home/root5:/bin/bash
root6:x:10101:10101::/home/root6:/bin/bash
root7:x:10102:10102::/home/root7:/bin/bash
root8:x:10103:10103::/home/root8:/bin/bash
root9:x:10104:10104::/home/root9:/bin/bash

打印出不包含nologin结尾的第1列和第7列
[root@localhost ~]# awk -F: '$7!~/nologin$/{print $1,$7}' /tmp/passwd|head -10
root /bin/bash
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
user /bin/bash
xxx /bin/bash
zhangsan /bin/bash
wangwu /bin/bash
wangwu2 /bin/bash
wangwu3 /bin/bash
4.BEGIN END 流程

awk还支持for循环、while循环、函数、数组等
其他
awk ‘BEGIN{ commands } pattern{ commands } END{ commands }’
第一步:运行BEGIN{ commands }语句块中的语句。
第二步:从文件或标准输入(stdin)读取一行。然后运行pattern{ commands }语句块,它逐行扫描文
件,从第一行到最后一行反复这个过程。直到文件所有被读取完成。
第三步:当读至输入流末尾时,运行END{ commands }语句块。
BEGIN语句块在awk开始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打
印输出表格的表头等语句通常能够写在BEGIN语句块中。
END语句块在awk从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总
都是在END语句块中完毕,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供pattern语句块,则默认运
行{ print },即打印每个读取到的行。awk读取的每一行都会运行该语句块。
这三个部分缺少任何一部分都可以

[root@localhost ~]# awk -F: '{if($3<10){print $0}}' /etc/passwd //第三列小于10的
打印整行
[root@localhost ~]# awk -F: '{if($3<10){print $3}else{print $1}}' /etc/passwd
第3列小于10的打印第3列,否则打印第1列
例
[root@localhost ~]#awk 'BEGIN{x=0};/\/bin\/bash$/ {x++;print x,$0};END {print
x}' /etc/passwd
#统计以/ bin/bash结尾的行数,等同于
[root@localhost ~]#grep -c "/bin/bash$" /etc/passwd
BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作; awk再处理指定的文本,之
后再执行END模式中指定的动作,END{}语句块中,往往会放入打印结果等语句
[root@localhost ~]#awk -F ":" '! ($3<200){print} ' /etc/passwd
#输出第3个字段的值不小于200的行
[root@localhost ~]#awk 'BEGIN {FS=":"} ;{if($3>=1000){print}}' /etc/passwd
#先处理完BEGIN的内容,再打印文本里面的内容
[root@localhost ~]#awk -F ":" ' {max=($3>=$4) ?$3:$4; {print max}} ' /etc/passwd
#($3>$4)?$3:$4三元运算符,如果第3个字段的值大于等于第4个字段的值,则把第3个字段的值赋给max,
否则第4个字段的值赋给max





[root@localhost ~]#awk -F ":" '{print NR,$0}' /etc/passwd
#输出每行内容和行号,每处理完一条记录,NR值加1
[root@localhost ~]#sed -n '=;p' /etc/passwd
[root@localhost ~]#awk -F ":" '$7~"bash"{print $1,47}' /etc/passwd
#输出以冒号分隔且第7个字段中包含/bash的行的第1个字段
[root@localhost ~]#awk -F: '/bash/ {print $1}' /etc/passwd
[root@localhost ~]#awk -F":"'($1~"root") && (NF==7) {print $1,$2,$NF } '
/etc/passwd
#第1个字段中包含root且有7个字段的行的第1、2个字段
[root@localhost ~]#awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print} '
/etc/passwd
#输出第7个字段既不为/bin/bash,也不为/sbin/nologin的所有行
#输出第7个字段既不为/bin/bash,也不为/sbin/nologin的所有行
[root@localhost ~]#awk -F: '($NF !=" /bin/bash")&&($NF !=" /sbin/nologin" )
{print NR, $0}' passwd
通过管道、双引号调用shell 命令:
[root@localhost ~]#echo $PATH | awk 'BEGIN{RS=":"};END {print NR}'
#统计以冒号分隔的文本段落数,END{ }语句块中,往往会放入打印结果等语句
[root@localhost ~]#echo $PATH | awk 'BEGIN{RS=":"};{print NR,$0};END {print NR}'
[root@localhost ~]#awk -F: '/bash$/{print | "wc -l"}' /etc/passwd
#调用wc -l命令统计使用bash 的用户个数,等同于grep -c "bash$" etc/passwd
[root@localhost ~]#awk -F: '/bash$/ {print}' /etc/passwd | wc -l
[root@localhost ~]#free -m |awk '/Mem:/ {print int($3/($3+$4)*100)"%"}' #查看当
前内存使用百分比
[ root@localhost ~]# free -m | awk '/Mem:/ {print $3/$2}'0.327869
[root@localhost ~]# free -m | awk '/Mem:/ {print $3/$2*100}'32.7869
[ root@localhost ~]# free -m | awk '/Mem:/ {print int($3/$2*100)}'32
[ root@localhost ~]# free -m | awk '/Mem:/ {print int($3/$2*100)"%"}’32%
[root@localhost ~]#free -m | awk '/Mem:/ {print $3/$2*100}' | awk -F. '{print $1
"%"}'
[root@localhost ~]#top -b -n 1 | grep Cpu | awk -F ',' '{print $4}'| awk '{print
$1}'
#查看当前CPU空闲率,(-b -n 1表示只需要1次的输出结果)
到 100%

top -b -n 1 | grep Cpu
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  
各字段含义
%Cpu(s)::这是 top 输出中 CPU 使用情况的前缀。
1.0 us:用户空间的 CPU 使用百分比(User space)。
0.2 sy:内核空间的 CPU 使用百分比(System)。
0.0 ni:用户进程的优先级调整(nice)的 CPU 使用百分比。
98.7 id:空闲 CPU 百分比(Idle)。
0.0 wa:等待 I/O 操作的 CPU 百分比(I/O wait)。
0.0 hi:硬件中断占用的 CPU 百分比(Hardware interrupts)。
0.0 si:软件中断占用的 CPU 百分比(Software interrupts)。
0.0 st:被虚拟化环境(如虚拟机)占用的 CPU 百分比(Steal time)。


[root@localhost ~]#date -d "$(awk -F "." '{print $1}'/proc/uptime) second
ago"+"%F%H:%M:%S" 
显示上次系统重启时间,等同于uptime; second ago为显示多少秒前的时间,+$” 选日:3N:3S等同于
+"3Y-n-%d 3日:8N:8S"的时间格式

[root@localhost ~]#date -d "$(awk -F "." '{iprint $1}'/proc/uptime) second
ago"+"号F%H:%M:%S" 了解
#显示上次系统重启时间,等同于uptime; second ago为显示多少秒前的时间,+"F悉日:M::S"等同于
+"%1-tm-d 日: 38:8S"的时间格式
[root@localhost ~]# awk 'BEGIN {n=0 ; while ("w" | getline) n++ ; {print n-2}}'
#调用w命令,并用来统计在线用户数

[root@localhost ~]#seq 10 | awk ' {getline; print $0 }'
[root@localhost ~]#seq 10 | awk ' { print $0 ; getline } '
[root@localhost ~]#awk 'BEGIN { "hostname" | getline ; {print $0}}'
#调用hostname,并输出当前的主机名
#当getline左右无重定向符"<"或"I"时,awk首先读取到了第一行,就是1,然后getline,就得到了1下面
的第二行,就是2,因为getline之后,awk会改变对应的NE,NR,FNR和$0等内部变量,所以此时的$O的值
就不再是1,而是2了,然后将它打印出来。
当getline左右有重定向符"<"或"I"时,getline则作用于定向输入文件,由于该文件是刚打开,
并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。
CPU使用率
cpu_us=`top -b -n 1 | grep Cpu | awk '{print $2}'`
#用户空间程序CPU的占用的比列
cpu_sy=`top -b -n 1 | grep Cpu | awk -F ',' '{print $2}' | awk '{print $1}'`
# 系统占用的时间比列
cpu_sum=$(echo "$cpu_us + $cpu_sy" | bc)    bc运算小数
echo $cpu_sum
vmstat
echo "A B C D" | awk '{OFS="|"; print $0;$1=$1;print $0}'
A B C D
A|B|C|D
$1=$1是用来激活$0的重新赋值,也就是说
字段$1...和字段数NF的改变会促使awk重新计算$0的值,通常是在改变OFS后而需要输出$0时这样做
echo "A B C D" | awk 'BEGIN{OFS="|"};{print $0;$1=$1;print $0}'
echo "A B C D" | awk 'BEGIN{OFS="|"};{print $0;$1=$1;print $1,$2}'
echo "A B C D" | awk 'BEGIN{OFS="|"};{$2=$2;print $1,$2}'
5.数值和字符串比较

==等于
!=不等于
<=小于等于

=大于等于
<小于
大于

[root@localhost ~]# awk 'NR==11{print}' /tmp/passwd 
games:x:12:100:games:/usr/games:/sbin/nologin

[root@localhost ~]# awk -F: '$1=="root"' /tmp/passwd 
root:x:0:0:root:/root:/bin/bash

[root@localhost ~]# awk 'NR<5' /tmp/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

[root@localhost ~]# awk -F: '$3>1000' /tmp/passwd|head -10
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
xxx:x:1001:1001::/home/xxx:/bin/bash
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
wangwu:x:1003:1003::/home/wangwu:/bin/bash
wangwu2:x:1004:1004::/home/wangwu2:/bin/bash
wangwu3:x:1005:1005::/home/wangwu3:/bin/bash
abc:x:1006:1006::/home/abc:/bin/bash
qwe:x:1007:1007::/home/qwe:/bin/bash
plplp:x:1008:1008::/home/plplp:/bin/bash
XXK:x:1009:1009::/home/XXK:/bin/bash

[root@localhost ~]# awk -F: '$3>=1000' /tmp/passwd|head -10
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
user:x:1000:1000:USER:/home/user:/bin/bash
xxx:x:1001:1001::/home/xxx:/bin/bash
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
wangwu:x:1003:1003::/home/wangwu:/bin/bash
wangwu2:x:1004:1004::/home/wangwu2:/bin/bash
wangwu3:x:1005:1005::/home/wangwu3:/bin/bash
abc:x:1006:1006::/home/abc:/bin/bash
qwe:x:1007:1007::/home/qwe:/bin/bash
plplp:x:1008:1008::/home/plplp:/bin/bash

[root@localhost ~]# awk -F: '$3<=1000' /tmp/passwd|head -10
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

6.逻辑运算 && ||

&& 和 || 是逻辑运算符,用于组合多个条件并控制程序流程。
&& 要求所有条件都为真时才成立,否则不成立。
|| 只要有一个条件为真条件成立,全为假时不成立。

[root@localhost ~]# awk -F: 'NR>4 && NR<10' /tmp/passwd
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

打印出1~100之间能被3整除的并且包含3的
[root@localhost ~]# seq 100|awk '$1%7==0 && $1~/3/'
35
63

7.awk if语句
第3列小于10的打印整行
[root@localhost ~]# awk -F: '{if($3<10){print $0}}' /tmp/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

[root@localhost ~]# awk -F: '{if($3<10){print $3}else{print $1}}' /tmp/passwd
8.awk高级用法
#定义引用变量
[root@localhost ~]# a=100
[root@localhost ~]# awk -v b="$a" 'BEGIN{print b}'
#将系统的变量a,在awk里赋值为变量b,然后调用变量b -v 选项将其传递给 awk
100
[root@localhost ~]# awk 'BEGIN{print "'$a'"}' 直接调用的话需要先用双引号再用单引号
100
[root@localhost ~]# awk -vc=1 'BEGIN{print c}' awk直接定义变量并引用
1
[root@localhost ~]# df -h | awk 'BEGIN{getline}/root/{print $0}'
#调用函数getline,读取一行数据的时候并不是得到当前行而是当前行的下一行
/dev/mapper/centos-root 50G 5.2G 45G 11% /
[root@localhost ~]# seq 10 | awk '{getline;print $0}' 显示偶数行  getline函数调用  
2
4
6
8
10
[root@localhost ~]# seq 10 | awk '{print $0;getline}' 显示奇数行
1
3
5
7
9
9.awk属组
PS1:BEGIN中的命令只执行一次
PS2: awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号
[root@localhost ~]#awk 'BEGIN{a[0]=10;a[1]=20;print a[1]}'
[root@localhost ~]#awk 'BEGIN{a[0]=10;a[1]=20;print a[0]}'
[root@localhost ~]#awk 'BEGIN{a["abc"]=10;a["xyz"]=20;print a["abc"]}'
[root@localhost ~]#awk 'BEGIN{a["abc"]=10;a["xyz"]=20;print a["xyz"]}'
5.8 awk 循环
例
[root@localhost ~]#awk 'BEGIN{a["abc"]="aabbcc";a["xyz"]="xxyyzz";print
a["xyz"]}'
10.awk循环
#结合数组和for循环
[root@localhost ~]# awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;for(i in a){print
i,a[i]}}'
使用awk统计httpd 访问日志中每个客户端IP的出现次数?
答案:
[root@localhost ~]# awk '{a[$1]+=1;} END {for(i in a){print a[i]" "i;}}'
/var/log/httpd/access_log | sort -r
[root@localhost ~]# awk '{ip[$1]++;}END{for(i in ip){print ip[i],i}}'
/var/log/httpd/access_log | sort -r
备注:定义数组,数组名称为ip,数字的下标为日志文件的第1列(也就是客户端的IP地址),++的目的在于对
客户端进行统计计数,客户端IP出现一次计数器就加1。END中的指令在读取完文件后执行,通过循环将所有统
计信息输出,for循环遍历的是数组名ip的下标。
可用awk来统计固定格式日志里的一些数据,如日志中出现过所有不同的IP
awk对文件进行流处理,每次读取一行。$1就是IP,count[i]++是将IP作为一个数组的下标,并且使得统计
这个IP所对应的数组元素自增1.END后面的语句是打印结果,只执行一次
awk ‘{i=$1;count[i]++}END{for(i in count)print(i,count[i])}’
/var/log/httpd/access_log
[root@localhost ~]# awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i],
i);}'
#日志文件 | sort -n | tail -n 10 #用tail显示最后10行
[root@localhost ~]# awk '/Failed password/ {print $0} ' /var/log/secure
[root@localhost ~]# awk '/Failed password/ {print $11} ' /var/log/secure
[root@localhost ~]# awk '/Failed/{ip[$11]++}END{for(i in ip){print i","ip[i]}}'
/var/log/secure
#中断 几次
[root@localhost ~]# awk '/Failed password/{ip[$11]++}END{for(i in ip){print
i","ip[i]}}' /var/log/secure
#失败几次
脚本编写
#!/bin/ bash
x=`awk '/Failed password/{ip[$11]++}END{for(i in ip){print i","ip[i]}}'
/var/log/secure`
6、总结
#190.168.10.22 3
for j in $x
do
ip=`echo $j | awk -F "," '{print $1}'`
num=`echo $j | awk -F "," '{print $2}'`
if [ $num -ge 3 ];then
echo "警告! $ip访问本机失败了$num次,请速速处理!"
fi
done


 
怎么提取版本号 1.9.7 
ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar
[root@localhost /]#cat 1.txt |sed -r 's/.*-(.*)\.jar/\1/'
1.9.7
1.9.7
2.7.7
3.4
1.0
0.7.6
5.0.4
1.9.5
1.64
1.46
1.64
2.5.5
awk '{ match($0, /[0-9]+\.[0-9]+(\.[0-9]+)?/, arr); print arr[0] }' ceshi.txt
awk -F'-|.jar' '{print $(NF-1)}' ceshi.txt

需求:1.txt 文件中的内容 帅选出第一列 第三列 并且打印为一行,同时需求两列内容相隔2个空格
zhangsan 20 江苏南京 汉族 内容 文件名称1.txt
sed -e 's/[[:space:]]/\n/g' /root/text1.txt | grep -v ^$ |tr "\n" "_" | awk -
F'_' 'BEGIN{num=0;}{for(i=0;i<NF;i++){num=num+1}}END{for(x=1;x<num;x++){if(x==1)
{printf $x}else{printf "_"$x}} }'
grep 和 egrep 文本过滤 (更适合单纯的查找或匹配文本)
sed 流编辑器 实现编辑的(更适合编辑匹配到的文本)
awk 文本报告生成器 实现格式化文本输出(更适合格式化文本,对文本进行较复杂格式处理

5.uniq

用于去除连续的重复行,通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重
格式
uniq [选项] 参数
常用选项
-c:对重复的行进行计数
-d:仅显示重复行
-u:仅显示出现一次的行

创建一个文本练习
cat <<EOF > 7.txt
apple
banana
apple
orange
banana
grape
apple
banana
orange
grape
grape
apple
banana
banana
EOF

统计重复行的次数,不连续的重复行不算入统计范围
[root@localhost ~]# cat 7.txt|uniq -c
      1 apple
      1 banana
      1 apple
      1 orange
      1 banana
      1 grape
      1 apple
      1 banana
      1 orange
      2 grape
      1 apple
      2 banana

结合sort按正序排序,并且统计重复的行
[root@localhost ~]# cat 7.txt|sort|uniq -c
      4 apple
      5 banana
      3 grape
      2 orange

结合sort使用,过滤出重复行
[root@localhost ~]# cat 7.txt|sort|uniq -d
apple
banana
grape
orange

结合sort使用,过滤出不重复的行
[root@localhost ~]# cat 7.txt|sort|uniq -u
[root@localhost ~]# 

结合sort使用,去重
[root@localhost ~]# cat 7.txt|sort|uniq
apple
banana
grape
orange

[root@localhost ~]# who|awk '{print $1}'|uniq
root
还可以使用sort -u和cat 7.txt|sort|uniq一样效果
[root@localhost ~]# cat 7.txt|sort -u
apple
banana
grape
orange

6.tr

用一个字符来替换另一个字符,或者可以完全除去一些字符,也可用来除去重复字符
格式
用法:tr [选项]… SET1 [SET2]
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。
常用选项
-d 删除字符
-s 删除所有重复出现的字符,只保留第一个

创建一个文本练习
cat <<EOF > 7.txt
apple
banana
apple
orange
banana
grape
apple
banana
orange
grape
grape
apple
banana
banana
EOF

将所有小写改成大写
[root@localhost ~]# cat 7.txt|tr 'a-z' 'A-Z'
APPLE
BANANA
APPLE
ORANGE
BANANA
GRAPE
APPLE
BANANA
ORANGE
GRAPE
GRAPE
APPLE
BANANA
BANANA

将apple五个字符改成大写APPLE
[root@localhost ~]# cat 7.txt|tr 'apple' 'APPLE'
APPLE
bAnAnA
APPLE
orAngE
bAnAnA
grAPE
APPLE
bAnAnA
orAngE
grAPE
grAPE
APPLE
bAnAnA
bAnAnA

将小写“a”改成“.”号
[root@localhost ~]# cat 7.txt|tr 'a' '. '
.pple
b.n.n.
.pple
or.nge
b.n.n.
gr.pe
.pple
b.n.n.
or.nge
gr.pe
gr.pe
.pple
b.n.n.
b.n.n.

将“pp”改成“?”号
[root@localhost ~]# cat 7.txt|tr 'pp' '?'
a??le
banana
a??le
orange
banana
gra?e
a??le
banana
orange
gra?e
gra?e
a??le
banana
banana

删除小写a
[root@localhost ~]# cat 7.txt|tr -d 'a'
pple
bnn
pple
ornge
bnn
grpe
pple
bnn
ornge
grpe
grpe
pple
bnn
bnn

删除换行
[root@localhost ~]# cat 7.txt|tr -d '\n'
applebananaappleorangebananagrapeapplebananaorangegrapegrapeapplebananabanana[root@localhost ~]# 

删除重复的"p"
ot@localhost ~]# cat 7.txt|tr -s 'p'
aple
banana
aple
orange
banana
grape
aple
banana
orange
grape
grape
aple
banana
banana

换单引号则需要用双引号把单引号引起来,用转义符也不行
[root@localhost ~]# cat fruit | tr "'" '/'  
apple
apple
peache
pear
banana
cherry
cherry
banana
/orange/

7.sort

以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。
格式
sort [选项] 参数
常用选项
**-**t:指定分隔符,默认使用[Tab]吧 键或空格分隔
-k:指定排序区域,哪个区间排序
-n:按照数字进行排序,默认是以文字形式排序
-u:等同于 uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重不生效
-r:反向排序,默认是升序,-r就是降序
-o:将排序后的结果转存至指定文件

按第一列升序排序
[root@localhost ~]# sort /etc/passwd|head -10
abc:x:1006:1006::/home/abc:/bin/bash
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:994:990::/var/lib/chrony:/sbin/nologin
colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin

以冒号为分隔符,以数字大小对第三列升序排序
[root@localhost ~]# sort -n -t: -k3 /etc/passwd|head -10
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 ~]# sort -nr -t: -k3 /etc/passwd|head -10
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash
fxfxfx19:x:10164:10164::/home/fxfxfx19:/bin/bash
fxfxfx18:x:10163:10163::/home/fxfxfx18:/bin/bash
fxfxfx17:x:10162:10162::/home/fxfxfx17:/bin/bash
fxfxfx16:x:10161:10161::/home/fxfxfx16:/bin/bash
fxfxfx15:x:10160:10160::/home/fxfxfx15:/bin/bash
fxfxfx14:x:10159:10159::/home/fxfxfx14:/bin/bash
fxfxfx13:x:10158:10158::/home/fxfxfx13:/bin/bash
fxfxfx12:x:10157:10157::/home/fxfxfx12:/bin/bash

以冒号为分隔符,以数字大小对第三列降序排序
将结果不在屏幕上输出而是输出到6.txt文件,并且只显示10行
[root@localhost ~]# sort -nr -t: -k3 /etc/passwd -o 6.txt
[root@localhost ~]# cat 6.txt|head -10
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
fxfxfx20:x:10165:10165::/home/fxfxfx20:/bin/bash
fxfxfx19:x:10164:10164::/home/fxfxfx19:/bin/bash
fxfxfx18:x:10163:10163::/home/fxfxfx18:/bin/bash
fxfxfx17:x:10162:10162::/home/fxfxfx17:/bin/bash
fxfxfx16:x:10161:10161::/home/fxfxfx16:/bin/bash
fxfxfx15:x:10160:10160::/home/fxfxfx15:/bin/bash
fxfxfx14:x:10159:10159::/home/fxfxfx14:/bin/bash
fxfxfx13:x:10158:10158::/home/fxfxfx13:/bin/bash
fxfxfx12:x:10157:10157::/home/fxfxfx12:/bin/bash

去掉文件中重复的行,重复的行可以是不连续的,并且显示10行
[root@localhost ~]# sort -u /etc/passwd|head -10
abc:x:1006:1006::/home/abc:/bin/bash
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:994:990::/var/lib/chrony:/sbin/nologin
colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

8.cut

列截取工具
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
适合截取单个字符和中间有多个间隔的
常用选项
-b:按字节截取
-c:按字符截取,常用于中文
-d:指定以什么为分隔符截取,默认为制表符
-f:通常和-d一起

以“ :”作为分隔截取/etc/passwd第一列
[root@localhost ~]# head -10 /etc/passwd|cut -d ":" -f 1
或者head -10 /etc/passwd|cut -d ':' -f 1
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

按字节截取第三个
[root@localhost ~]# head -10 /etc/passwd|cut -b 3
o
n
e
m
:
n
u
l
i
e

按字符截取第二个(一般用来截取中文 )
[root@localhost ~]# head -10 /etc/passwd|cut -c 2
o
i
a
d
p
y
h
a
a
p

[root@localhost ~]# head -10 /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

9.综合

查看登陆用户打印出第一列
[root@localhost ~]# who
root     pts/0        2024-07-29 08:19 (192.168.72.1)
[root@localhost ~]# who|awk '{print $1}'
root

[root@localhost ~]# who|cut -d' ' -f1|uniq
root

[root@localhost ~]# w|cut -d' ' -f1|uniq|sort|grep -v "^$" 
root
USER

查看登陆过系统的用户并且打印出来第一列整理并且过滤出不是空行不含wtmp字符的
[root@localhost ~]# last|awk '{print $1}'|sort|uniq|grep -v "^$"|grep -v wtmp
reboot
root

统计链接主机数,以数字形式显示地址和端口,不进行主机名和端口名的解析,且是tcp连接的
[root@localhost ~]# ss -nt|tr -s " "|cut -d " " -f5|cut -d ":" -f1|sort|uniq -c
      1 192.168.72.1
      1 Address


统计当前主机的连接状态,以数字形式显示地址和端口,显示 TCP的所有套接字。
[root@localhost ~]# ss -nta | grep -v '^State' |cut -d" " -f1|sort |uniq -c
      1 ESTAB
     12 LISTEN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值