linux 文本处理工具 cut 和 awk
cut
cut 剪切数据。从文件的每一行剪切字节、字符、和字段,并将这些字节、字符和字段输出。
1. 基本用法
cut [选项参数] 文件名
默认分隔符是制表符
2. 选项参数说明
-f 所提取的列号
-d 分隔符,按照指定分隔符分割列
-c 按字符进行切割,后加数字表示第几列
3. 案例演示
[root@daidai tmp]# cat ./data.txt
zhanglaosan 20 man zhangsan.com
lilaosi 21 man lisi.cn
walaowu 20 woman wangwu.org
# 取第一列
[root@daidai tmp]# cut -d " " -f 1 ./data.txt
zhanglaosan
lilaosi
walaowu
# 取第1,3列
[root@daidai tmp]# cut -d " " -f 1,3 ./data.txt
zhanglaosan man
lilaosi man
walaowu woman
# 取ifconfig ens33结果中的ip地址
[root@daidai tmp]# ifconfig ens33 | grep broadcast | cut -d " " -f 10
192.168.100.101
解释一下上面的为什么是10
前面绿色的部分为8个“ ”,后一部分为1个“ ”,可以理解为取第10个“ ”前面的那一列。
awk
把文件逐行读入,默认以空格为分隔符进行切分,再进行处理。
1. 基本用法
awk [选项参数] '/parttern1/{actiion1} /parttern2/{actiion2}...' 文件名
pattern:awk在数据中心查找的内容,就是匹配模式。
action:在找到匹配内容时执行的命令。
2. 选项参数说明
-F 指定分割符
-v 赋值一个用户定义变量
3. 案例演示
[root@daidai tmp]# cat ./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
# 搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 7 列。
[root@daidai tmp]# awk -F : '/^root/{print}' ./passwd
root:x:0:0:root:/root:/bin/bash
[root@daidai tmp]# awk -F : '/^root/{print $7}' ./passwd
/bin/bash
# 搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 1 列和第 7 列,中间以“,”号分割。
[root@daidai tmp]# awk -F : '/^root/{print $1 "," $7}' ./passwd
root,/bin/bash
# 只显示/etc/passwd 的第一列和第七列,以逗号分割,且在所有行前面添加列名 user,shell 在最后一行添加"end..."。
[root@daidai tmp]# awk -F : 'BEGIN{print "user, bash"} {print $1 ", " $7} END{print "end..."}' ./passwd
user, bash
root, /bin/bash
bin, /sbin/nologin
daemon, /sbin/nologin
adm, /sbin/nologin
lp, /sbin/nologin
sync, /bin/sync
end...
# awk 内置变量
FILENAME 文件名
NR 行号
NF 列数
# 统计 passwd 文件名,每行的行号,每行的列数
[root@daidai tmp]# awk -F : '{print "filename:" FILENAME " linenum:" NR " col:" NF}' ./passwd
filename:./passwd linenum:1 col:7
filename:./passwd linenum:2 col:7
filename:./passwd linenum:3 col:7
filename:./passwd linenum:4 col:7
filename:./passwd linenum:5 col:7
filename:./passwd linenum:6 col:7
# 取ifconfig ens33结果中的ip地址
[root@daidai tmp]# ifconfig ens33 | awk '/broadcast/{print $2}'
192.168.100.101