1.grep
语法格式:
grep '字符串' file
其他命令输出|grep '字符串'
参数选项:
-v 取反
-r 递归过滤
-i 不区分大小写
-E 支持扩展正则
-w 过滤单词(以空格为分隔)
-o 查看匹配过程
-c 统计单词数量
-n 显示过滤到内容的行号
-A5 显示过滤到内容的下5行
-B5 显示过滤到内容的上5行
-C5 显示过滤到内容的上下各5行
-r递归过滤:
[root@linuxsd opt]# grep -r 'linuxsd' *
1.txt:www.linuxsd.com
oldboy/code.txt:www.linuxsd.com
-w用法:
[root@linuxsd opt]# cat 2.txt
oldboy1123
oldboy
test
test123
oldboy
[root@linuxsd opt]# grep 'oldboy' 2.txt
oldboy1123
oldboy
oldboy
[root@linuxsd opt]# grep -w 'oldboy' 2.txt
oldboy
oldboy
-c 统计过滤到内容的数量:
[root@linuxsd opt]# grep -c 'oldboy' 2.txt
3
-n 显示过滤到内容的行号
[root@linuxsd opt]# grep -n 'test' 2.txt
3:test
4:test123
[root@linuxsd opt]# grep -A5 '5' 1.txt
5
6
7
8
9
10
[root@linuxsd opt]# grep -B5 '5' 1.txt
2
111
123
3
4
5
2.sed
语法格式:
sed '模式 动作' file
sed -n '5,10p' file # 逗号为区间范围
模式: 找谁 如何找 找行 找第几行
动作: 干啥 输出 删除 增加内容
sed -n 取消默认输出(在查找内容时)
sed -r 支持扩展正则
sed -n '//,//p' file
作用:
1.替换字符
2.模糊过滤
3.后向引用(格式化输出)
案例1: 过滤出文件的第3行
[root@linuxsd ~]# sed -n '3p' test.txt
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
案例2: 显示最后一行
[root@linuxsd ~]# sed -n '$p' test.txt
10 operator:x:11:0:operator:/root:/sbin/nologin
案例3: 显示5-最后一行 区间范围,
[root@linuxsd ~]# sed -n '5,$p' test.txt
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
案例4: 模糊查找
[root@linuxsd ~]# sed -n '/root/p' test.txt
1 root:x:0:0:root:/root:/bin/bash
10 operator:x:11:0:operator:/root:/sbin/nologin
案例5: 查找以sh结尾的行
[root@linuxsd ~]# sed -n '/sh$/p' test.txt
1 root:x:0:0:root:/root:/bin/bash
案例6: 查找以shut开头的行
[root@linuxsd ~]# cat oldboy.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@linuxsd ~]# sed -n '/^shut/p' oldboy.txt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
案例7.查找包含root或者shut的行
[root@linuxsd ~]# sed -rn '/shut|root/p' oldboy.txt
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
operator:x:11:0:operator:/root:/sbin/nologin
案例8.模糊过滤查找区间范围
[root@linuxsd ~]# sed -n '/adm/,/shut/p' oldboy.txt
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
区间范围的注意事项:
[root@linuxsd ~]# cat 2.txt
test
aaa
bbb
oldboy
ccc
ddd
test
yyyy
uuuu
[root@linuxsd ~]# sed -n '/test/,/oldboy/p' 2.txt
test
aaa
bbb
oldboy
test
yyyy
3uuuu
第二种清空:
[root@linuxsd ~]# cat 2.txt
test
aaa
bbb
oldboy
ccc
ddd
yyyy
oldboy
uuuu
[root@linuxsd ~]# sed -n '/test/,/oldboy/p' 2.txt
test
aaa
bbb
oldboy
案例: 在企业中常用 过滤时间的区间范围 需求 帮我统计日志上午10点到12点的数据总共行数
将时间视为字符串进行区间匹配
[root@linuxsd ~]# sed -n '/Jul 13 10:01:01/,/Jul 13 11:44:47/p' /var/log/messages|wc -l
15
2.1 sed之删除命令
语法结构:
sed 'nd' file 删除文件的第n行 不影响源文件
sed -i 'nd' file 删除源文件的第n行
sed '3,5d' file 删除指定行的范围
sed '/字符串/d' 模糊过滤删除
sed '/字符串/,/字符串/d' 删除区间范围
案例1: 删除文件的第5行
[root@linuxsd ~]# sed '5d' oldboy.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
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
案例2: 删除5到最后一行
[root@linuxsd ~]# sed '5,$d' oldboy.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
案例3: 删除包含shutdown的行
[root@linuxsd ~]# sed '/shut/d' oldboy.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
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
案例4: 真正的删除源文件的以bin开头的行
[root@linuxsd ~]# sed -i '/^bin/d' oldboy.txt
[root@linuxsd ~]# cat oldboy.txt
root:x:0:0:root:/root:/bin/bash
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
案例5: 按区间范围删除
语法结构:
sed 'nd' file 删除文件的第n行 不影响源文件
sed -i 'nd' file 删除源文件的第n行
sed '3,5d' file 删除指定行的范围
sed '/字符串/d' 模糊过滤删除
sed '/字符串/,/字符串/d' 删除区间范围
案例1: 删除文件的第5行
[root@linuxsd ~]# sed '5d' oldboy.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
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
案例2: 删除5到最后一行
[root@linuxsd ~]# sed '5,$d' oldboy.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
案例3: 删除包含shutdown的行
[root@linuxsd ~]# sed '/shut/d' oldboy.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
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
案例4: 真正的删除源文件的以bin开头的行
[root@linuxsd ~]# sed -i '/^bin/d' oldboy.txt
[root@linuxsd ~]# cat oldboy.txt
root:x:0:0:root:/root:/bin/bash
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
案例5: 按区间范围删除
[root@linuxsd ~]# sed '/adm/,/halt/d' oldboy.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
2.2sed增加内容或者将内容写入到文件中
sed之增加内容
语法结构:
sed '3a 字符串' file # 在第三行的下面插入字符串
sed '3i 字符串' file # 在第三行处插入字符串
sed '3c 字符串' file # 替换第3行为字符串 掌握
sed '3w 1.txt' file # 将第3行的内容写入到1.txt文件中
sed -i 修改源文件的内容
案例1.在第3行的下面插入aaaaaa
[root@linuxsd ~]# sed '3a 123456' 2.txt
test
aaaa
oldboy
123456
ccc
ddd
yyyy
oldboy
uuuu
案例2: 在当前的位置插入
[root@linuxsd ~]# sed '3i 123456' 2.txt
test
aaaa
123456
oldboy
ccc
ddd
yyyy
oldboy
uuuu
案例3: 替换当前整行内容 重要
[root@linuxsd ~]# sed '3c 123456' 2.txt
test
aaaa
123456
ccc
ddd
yyyy
oldboy
uuuu
企业案例: 替换整行
[root@linuxsd ~]# sed -i '7c SELINUX=disabled' /etc/selinux/config
案例4.将文件的第3行重新写入到1.txt文件中
[root@linuxsd ~]# sed '3w 1.txt' 2.txt
test
aaaa
oldboy
ccc
ddd
yyyy
oldboy
uuuu
[root@linuxsd ~]# cat 1.txt
oldboy
2.3 sed替换文件内容
语法格式:
sed 's#字符串#替换成谁#g' file
sed 's///g' file
sed 's@@@g' file
sed 's###' file
边界的两种方 \b、\<字符串\>
案例1.替换root为oldboy
[root@linuxsd ~]# sed 's#root#oldboy#g' oldboy.txt
oldboy:x:0:0:oldboy:/oldboy:/bin/bash
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
:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin
案例2.s### 替换 不是全局替换 只替换每行的第一个root
[root@linuxsd ~]# sed 's#root#oldboy#' oldboy.txt
oldboy:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nolo
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:/oldboy:/sbin/nologin
案例3: 将bin替换成oldboy \b边界 (过滤身份证号)
[root@linuxsd ~]# sed 's#\bbin\b#oldboy#g' oldboy.txt
root:x:0:0:root:/root:/oldboy/bash
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:/binnn/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@linuxsd ~]# sed 's#\<bin\>#oldboy#g' oldboy.txt
root:x:0:0:root:/root:/oldboy/bash
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:/binnn/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
案例4: 替换文件中的/bin 为oldboy 遇到替换/时 只需要格式变化 ###
[root@linuxsd ~]# sed 's/\/bin/oldboy/g' oldboy.txt
root:x:0:0:root:/root:oldboy/bash
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:oldboynn/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@linuxsd ~]# sed 's#/bin#oldboy#g' oldboy.txt
案例5: 删除文件中所有的数字
[root@linuxsd ~]# sed 's#[0-9]##g' oldboy.txt
root:x:::root:/root:/bin/bash
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/binnn/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin
删除文件中所有的字母
[root@linuxsd ~]# sed 's#[a-Z]##g' oldboy.txt
::0:0::/://
::2:2::/://
::3:4:://://
::4:7::///://
::5:0::/://
::6:0::/://
::7:0::/://
::8:12::///://
::11:0::/://
删除字母和数字
[root@linuxsd ~]# sed 's#[a-Z0-9]##g' oldboy.txt
:::::/://
:::::/://
::::://://
:::::///://
:::::/://
:::::/://
:::::/://
:::::///://
:::::/://
删除特殊符号和x和数字 只留字母
[root@linuxsd ~]# sed 's#[0-9/:x]# #g' oldboy.txt|xargs -n1|sort |uniq -c|sort -rn|grep -o
11 sbin
5 nologin
4 root
3 var
3 sync
3 shutdown
删除特殊符号和x和数字 只留单个字符
[root@linuxsd ~]# sed 's#[0-9/:x]# #g' oldboy.txt|egrep -o '[a-z]'|sort |uniq -c|sort -rn|head -5
80 n
71 o
62 s
54 i
39 t
正则取反:
[root@linuxsd ~]# sed -r 's#[^a-Z]|x# #g' oldboy.txt
root root root bin bash
daemon daemon sbin sbin nologin
adm adm var adm sbin nologin
lp lp var spool lpd sbin nologin
sync sync sbin binnn sync
shutdown shutdown sbin sbin shutdown
halt halt sbin sbin halt
mail mail var spool mail sbin nologin
operator operator root sbin nologin
注意: 正则中的任意或者连续
[root@linuxsd ~]# cat hehe.txt
root:x:0:0:root:/root:/bin/bash
[root@linuxsd ~]# sed 's#:/# #g' hehe.txt :/为连续的
root:x:0:0:root root bin/bash
[root@linuxsd ~]# sed 's#[:/]# #g' hehe.txt :或/任意单个
root x 0 0 root root bin bash
sed之模式+动作
语法结构:
案例1: 将第行的adm替换成oldboy
[root@linuxsd ~]# sed -n '3p' oldboy.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@linuxsd ~]# sed -n '3s#adm#oldboy#gp' oldboy.txt
oldboy:x:3:4:oldboy:/var/oldboy:/sbin/nologin
案例2: 替换1-3行的bin为A
[root@linuxsd ~]# sed -n '1,3s#bin#A#gp' oldboy.txt
root:x:0:0:root:/root:/A/bash
daemon:x:2:2:daemon:/sA:/sA/nologin
adm:x:3:4:adm:/var/adm:/sA/nologin
案例3: 模糊过滤+替换动作 '//p' "p的意思是print打印"
#查找adm开头的行
[root@linuxsd ~]# sed -n '/adm/p' oldboy.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
#adm开头的行把bin换成hehe
[root@linuxsd ~]# sed -n '/adm/s#bin#hehe#gp' oldboy.txt
adm:x:3:4:adm:/var/adm:/shehe/nologin
#adm-shut开头的行把bin换成hehe
[root@linuxsd ~]# sed -n '/adm/,/shut/s#bin#hehe#gp' oldboy.txt
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/shehe/nologin
sync:x:5:0:sync:/shehe:/hehenn/sync
shutdown:x:6:0:shutdown:/shehe:/shehe/shutdown
修改源文件不要n和p输出直接i修改源文件
#n和p为输出打印在屏幕上 -i为永久修改
[root@linuxsd ~]# sed -i '/adm/s#bin#hehe#g' oldboy.txt
[root@linuxsd ~]# cat oldboy.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/binnn/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
2.4 向后引用
[root@linuxsd opt]# echo test oldboy|sed -r 's#(test oldboy)#\1#g'
test oldboy
[root@linuxsd opt]# echo test oldboy|sed -r 's#(test) oldboy#\1#g'
test
[root@linuxsd opt]# echo test oldboy|sed -r 's#(test) (oldboy)#\1#g'
test
[root@linuxsd opt]# echo test oldboy|sed -r 's#(test) (oldboy)#\2#g'
oldboy
向后引用想要谁 就把谁保护起来
[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#\1#g'
test
[root@linuxsd opt]#
[root@linuxsd opt]#
[root@linuxsd opt]#
[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#\2#g'
oldboy
格式化输出内容
[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#useradd \1#g'
useradd test
[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#useradd \1 passwd#g'
useradd test passwd
[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#<\1>#g'
<test>
[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#<\1>\n<\2>#g'
<test>
<oldboy>
案例:
[root@linuxsd opt]# ip add|grep 'eth0$'
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@linuxsd opt]#
[root@linuxsd opt]#
[root@linuxsd opt]# ip add|sed -n '/eth0$/p'
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
将所有的字符串写入到替换的位置 将输出的内容保护
[root@linuxsd opt]# ip add|grep 'eth0$'|sed -r 's#inet (10.0.0.200/24) brd 10.0.0.255 scope global noprefixroute eth0#\1#g'
10.0.0.200/24
[root@linuxsd opt]# ip add|grep 'eth0$'|sed -r 's#^.*et (.*) brd.*$#\1#g'
10.0.0.200/24
扩展:
touch 1.txt 2.txt
创建用户:
useradd oldboy1
[root@linuxsd opt]# useradd oldboy1
[root@linuxsd opt]# cat /etc/passwd
useradd oldboy2
useradd oldboy3
useradd oldboy5
后向引用拼接用户
[root@linuxsd opt]# echo {1..5}|xargs -n1|sed -r 's#(.*)#oldboy\1#g'
oldboy1
oldboy2
oldboy3
oldboy4
oldboy5
[root@linuxsd opt]# echo {1..5}|xargs -n1|sed -r 's#(.*)#useradd oldboy\1#g'
useradd oldboy1
useradd oldboy2
useradd oldboy3
useradd oldboy4
useradd oldboy5
shell将字符串变为可执行命令方式
[root@linuxsd opt]# echo pwd|bash
[root@linuxsd opt]# echo {1..5}|xargs -n1|sed -r 's#(.*)#useradd oldboy\1#g'|bash
3.awk
3.1 awk语法结构
作用:
1.取行
2.取列
3.取行取列
4.数据统计 字符串比较 数字比较
5.格式化输出
6.支持if判断 for循环 while 数组...
语法格式:
awk '{动作}' 文件 # 只有动作默认处理所有行
awk '模式' 文件 # 找谁 怎么找 取行 或者 取列
awk '模式{动作}' # 找谁 干啥
awk '{print $1,$5}' file
awk中的逗号为内置的变量: 里面存储着是空格
内置变量:
NR 行号
, 空格
$n 第n列
NF 存储最后一列的列号
awk取行:
语法: awk 'NR==3' 文件 # 查找指定的行
NR为awk的内置变量,将每行的行号赋值给NR
比较符:
NR==3 等于
NR>3 大于
NR>=3 大于等于3
NR<3 小于
NR<=3 小于等于3
NR!=3 不等于
&& 并且
|| 或者
3.2案列awk取行
案例1: 查找出文件的第3行
[root@linuxsd ~]# awk 'NR==3' oldboy.txt
adm:x:3:4:adm:/var/adm:/shehe/nologin
案例2: 查找出文件的小于3的行
[root@linuxsd ~]# awk 'NR<3' oldboy.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
案例3: 查找大于3的所有行
[root@linuxsd ~]# awk 'NR>3' oldboy.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/binnn/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
案例4: 查找大于5并且小于10的行 6-9行
[root@linuxsd ~]# awk 'NR>5&&NR<10' oldboy.txt
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
案例5: 查找等于1 或者 大于5的行
[root@linuxsd ~]# awk 'NR==1 || NR>5' oldboy.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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
awk取行
[root@linuxsd ~]# df -h|awk '/\/$/'
/dev/sda3 18G 2.3G 16G 13% /
[root@linuxsd ~]# df -h|awk '/^.*sda3/'
/dev/sda3 18G 2.3G 16G 13% /
awk模糊过滤
awk模糊过滤
语法: awk '/字符串/' file
awk '//,//' file
案例1: 找出包含root的行
[root@linuxsd ~]# awk '/root/' oldboy.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
案例2: 支持正则 查找包含root或者adm的行
[root@linuxsd ~]# awk '/root|adm/' oldboy.txt
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/shehe/nologin
operator:x:11:0:operator:/root:/sbin/nologin
案例3: 查找以bash结尾的行
[root@linuxsd ~]# awk '/bash$/' oldboy.txt
root:x:0:0:root:/root:/bin/bash
案例4: 查找以adm开头的
[root@linuxsd ~]# awk '/^adm/' oldboy.txt
adm:x:3:4:adm:/var/adm:/shehe/nologin
案例5: 查找root开头到shutdow结尾的
[root@linuxsd ~]# awk '/adm/,/sync/' oldboy.txt
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/binnn/sync
3.3 awk取列
语法结构: awk '{print $n}' file # n为数字
特点: $n n从第1列开始取值 以空格或tab键分隔列 $0 为整个文件内容
案例1.取出文件中的第一列
[root@linuxsd ~]# cat 2.txt
test 234
aaaa 234
oldboy 444
ccc 111
ddd 444
yyyy 777
oldboy 234
uuuu 888
[root@linuxsd ~]# awk '{print $1}' 2.txt
test
aaaa
oldboy
ccc
ddd
yyyy
oldboy
uuuu
案例2.取出文件中的第二列
[root@linuxsd ~]# awk '{print $2}' 2.txt
234
234
444
111
444
777
234
888
案例3.取出其他命令输出后的第n列
[root@linuxsd ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 980M 0 980M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.5M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda3 18G 2.3G 16G 13% /
/dev/sr0 4.4G 4.4G 0 100% /data
/dev/sda1 197M 110M 88M 56% /boot
tmpfs 199M 0 199M 0% /run/user/0
[root@linuxsd ~]# df -h|awk '{print $5}'
Use%
0%
0%
1%
0%
13%
100%
56%
0%
案例4.同时输出第1列和第5列
[root@linuxsd ~]# df -h|awk '{print $1,$5}'
Filesystem Use%
devtmpfs 0%
tmpfs 0%
tmpfs 1%
tmpfs 0%
/dev/sda3 13%
/dev/sr0 100%
/dev/sda1 56%
tmpfs 0%
案例5: 取出文件中的第5行和第1行
[root@linuxsd ~]# df -h|awk '{print $5,$1}'
Use% Filesystem
0% devtmpfs
0% tmpfs
1% tmpfs
0% tmpfs
13% /dev/sda3
100% /dev/sr0
56% /dev/sda1
0% tmpfs
如果想要输出普通字符串和空格可以使用双引号
[root@linuxsd ~]# df -h|awk '{print $5" "$1}'
Use% Filesystem
0% devtmpfs
0% tmpfs
1% tmpfs
0% tmpfs
13% /dev/sda3
100% /dev/sr0
56% /dev/sda1
0% tmpfs
案例6: 输出最后一列 使用NF
[root@linuxsd ~]# df -h|awk '{print $6}'
Mounted
/dev
/dev/shm
/run
/sys/fs/cgroup
/
/data
/boot
/run/user/0
[root@linuxsd ~]# awk '{print $NF}' 2.txt
234
234
444
111
444
777
234
888
案例7: 输出倒数第2列
[root@linuxsd ~]# awk '{print $0}' 4.txt
test 234 aaaa 222
234 oldboy 444 666
ccc 111 ddd
444 yyyy 777
oldboy 234 uuuu ppp
888
[root@linuxsd ~]# awk '{print $(NF-1)}' 4.txt
aaaa
444
111
yyyy
uuuu
888
3.4 awk指定分隔符
awk指定分隔符: 默认只按照空格和tab键分隔
[root@linuxsd ~]# awk '{print $1}' oldboy.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/binnn/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
awk -F 指定分隔符(指定任意的字符为分隔符)
[root@linuxsd ~]# awk -F: '{print $1}' oldboy.txt
root
daemon
adm
lp
sync
shutdown
halt
mail
operator
第二种写法:
[root@linuxsd ~]# awk -F ":" '{print $1}' oldboy.txt
root
daemon
adm
lp
sync
shutdown
halt
mail
operator
[root@linuxsd ~]# awk -F: '{print $NF}' oldboy.txt
/bin/bash
/sbin/nologin
/shehe/nologin
/sbin/nologin
/binnn/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
[root@linuxsd ~]# cat a.txt
root:x:0:0:root:/root:/bin/bash
[root@linuxsd ~]# awk -F/ '{print $1}' a.txt
root:x:0:0:root:
[root@linuxsd ~]# awk -F/ '{print $2}' a.txt
root:
[root@linuxsd ~]# awk -F/ '{print $3}' a.txt
bin
[root@linuxsd ~]# awk -F/ '{print $4}' a.txt
bash
3.5 awk使用正则方式指定分隔符
将:/看做一个整体进行分隔
[root@linuxsd ~]# cat a.txt
root:x:0:0:root:/root:/bin/bash
[root@linuxsd ~]# awk -F ":/" '{print $1}' a.txt
root:x:0:0:root
[root@linuxsd ~]# awk -F ":/" '{print $2}' a.txt
root
[root@linuxsd ~]# awk -F ":/" '{print $3}' a.txt
bin/bash
[]表示任意单个字符
[root@linuxsd ~]# cat a.txt
root:x:0:0:root:/root:/bin/bash
[root@linuxsd ~]# awk -F "[:/]" '{print $6}' a.txt
[root@linuxsd ~]# awk -F "[:/]" '{print $10}' a.txt
bash
连续出现的字符进行切割:
[root@linuxsd ~]# awk -F "[:/]+" '{print $8}' a.txt
bash
正则:
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql
+-:---oldboy-+:--test---::+mysql
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]" '{print $7}'
oldboy
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]" '{print $12}'
test
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]" '{print $NF}'
mysql
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]+" '{print $2}'
oldboy
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]+" '{print $3}'
test
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]+" '{print $4}'
mysql
以数字切割
[root@linuxsd ~]# cat a.txt
root:x:0:0:root:92/root:4/bin/bash
[root@linuxsd ~]# awk -F "[0-9]" '{print $1}' a.txt
root:x:
[root@linuxsd ~]# awk -F "[0-9]" '{print $5}' a.txt
/root:
[root@linuxsd ~]# awk -F "[0-9]+" '{print $4}' a.txt
/root:
[root@linuxsd ~]# awk -F "[0-9:/]+" '{print $5}' a.txt
bin
3.6 awk模式加动作
语法: awk '找谁{干啥}' file
awk '模式{动作}' file
找谁: 按照指定行
NR==5
NR>5
NR<5
NR!=5
NR>5&&NR==10
NR>5||NR==1
模糊过滤
awk '/字符串/' file
awk '//,//' file
案例1.显示第5行的第1列
[root@linuxsd ~]# awk -F: 'NR==5{print $1}' oldboy.txt
sync
[root@linuxsd ~]# awk -F: 'NR==5{print $NF,$1}' oldboy.txt
/binnn/sync sync
案例2.显示第2行到第5行的最后一列
[root@linuxsd ~]# awk -F: 'NR>=2&&NR<=5' oldboy.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/binnn/sync
[root@linuxsd ~]# awk -F: 'NR>=2&&NR<=5{print $1}' oldboy.txt
daemon
adm
lp
sync
[root@linuxsd ~]# awk -F: 'NR>=2&&NR<=5{print $NF}' oldboy.txt
/sbin/nologin
/shehe/nologin
/sbin/nologin
/binnn/sync
模糊过滤:
[root@linuxsd ~]# awk -F: '/root/{print $1}' oldboy.txt
root
operator
正则:
[root@linuxsd ~]# awk -F: '/^shut/{print $NF}' oldboy.txt
/sbin/shutdown
扩展了解: 字符串比对和匹配
[root@linuxsd ~]# awk -F: '$1=="root"' oldboy.txt
root:x:0:0:root:/root:/bin/bash
最后一列为/sbin/nolgoin的行
[root@linuxsd ~]# awk -F: '$NF=="/sbin/nologin"' oldboy.txt
daemon:x:2:2:daemon:/sbin:/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
按列匹配正则:
[root@linuxsd ~]# awk -F "[:/]+" '$6=="var"' oldboy.txt
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@linuxsd ~]# awk -F "[:/]+" '$6=="^v"' oldboy.txt
[root@linuxsd ~]#
[root@linuxsd ~]# awk -F "[:/]+" '$6 ~ "^v"' oldboy.txt
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@linuxsd ~]# awk -F "[:/]+" '$6 ~ "r$"' oldboy.txt
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
awk运算:
awk格式化输出:
[root@linuxsd ~]# awk -F: 'BEGIN{print "用户"}{print $1}END{print "结束"}' oldboy.txt
用户
root
daemon
adm
lp
sync
shutdown
halt
mail
operator
结束
[root@linuxsd ~]# echo oldboy{1..3}|xargs -n1|sed -r 's#(.*)#useradd \1#g'
useradd oldboy1
useradd oldboy2
useradd oldboy3
[root@linuxsd ~]# echo oldboy{1..3}|xargs -n1|awk '{print "useradd "$1}'
useradd oldboy1
useradd oldboy2
useradd oldboy3