三剑客(grep sed awk)
1 grep
用于文本过滤
使用格式:grep [选项] '正则表达式'
选项
-P:使用perl正则表达式
-i:ignorecase
-v:反转搜索,找到未匹配的行
2 sed
sed是一个流编辑器,会逐行读取文件内容,并逐行进行选取、替换、删除、新增等操作。
使用格式:sed [选项] '[动作]' 文件名
选项
-e:允许对输入数据应用多条sed命令编辑
-f 脚本文件名:从sed脚本中读入sed操作
-i:用sed的修改结果直接修改读取数据的文件(危险操作)
-h:显示帮助
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选项,则只会把经过sed命令处理的行输出到屏幕
-r:在sed中支持扩展正则表达式
-V:显示版本信息
动作
动作包括三部分:定位、操作、内容。
定位:
空地址 // 全文处理
单地址 // 匹配指定行
/pattern/ // 正则匹配
范围地址 // 10,20 十到二十行, 10,+5 十行向下五行, /pattern1/,/pattern2/ 匹配的两行正则之间的内容
步长 // 1~2 奇数, 2~2 偶数
操作:
a \:追加, 在当前行后添加一行或多行,添加多行时,除最后一行外,每行末尾都需要用'\'代表数据未完结
c \:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾都需要用'\'代表数据未完结
d :删除,删除指定行
i \:插入,在当前行前插入一行或多行,插入多行时,除最后一行外,每行末尾都需要用'\'代表数据未完结
p:打印;sed -n '/root/p':只打印包含 root 的行;/***/中的内容表示正则匹配语法脚本
s :替换,sed -e '3s/old/new/g':将第三行中的old 替换为 new,g 代表全局替换;'/'可以换成 '#','@'等
内容:
即操作后面对应的内容。
例如:读取ens33网卡中的ip信息
$ ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.17.134 netmask 255.255.255.0 broadcast 192.168.17.255
inet6 fe80::78f:d127:e696:8c98 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:51:7b:40 txqueuelen 1000 (Ethernet)
RX packets 17804 bytes 8874697 (8.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1321 bytes 142574 (139.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ ifconfig ens33 | sed -e '2s/ *inet *//' -e '2s/ *netmask.*//p' -n
192.168.17.134
3 awk
作用:把文件逐行读入,以空格为默认分割符,将每行切片,切开的部分再进行后续处理
使用格式:awk [选项] '定位{动作}'
awk [选项] '/正则表达式/ 动作' [文件]
- pattern:正则表达式
- action:对匹配到的内容执行的命令(默认为输入每行内容)
选项
参数 | 解释 |
---|---|
-F | 指定分隔符 |
-v | 定义或修改变量 |
-f | 从脚本读取awk命令 |
定位
变量:
内置变量 | 解释 |
---|---|
$0 | 整行记录 |
$n | 当前行的第n个域(从1开始计数) |
NF | 浏览记录的域的个数(列数) |
NR | 已读的记录数(当前处理行的行数) |
FNR | 文件内已读的记录数。(多个文件时,不同文件内正在处理的行号) |
FS | 设置输入域分割符,等价于命令行 -F 参数。默认为空格 |
OFS | 输入记录分割符。默认为空格 |
RS | 控制记录分割符(输入换行符) |
ORS | 输入记录分割符(输出换行符) |
FILENAME | 当前文件名 |
ARCG | 命令行参数个数 |
ARGV | 数组,保存命令行给定的各参数 |
BEGIN | 处理文本前要执行的操作 |
END | 处理文本后要执行的动作 |
例如:看第五行到第七行'NR==5,NR==7{print $0}'
自定义变量
awk可以自定义变量。如:awk -v myname="liff" 'BEGIN{print myname}'
也可以调用系统变量。如:awk -v mypath=$PATH 'BEGIN{print mypath}'
awk可以根据NR参数
配合条件判断符号进行组合筛选特定的行,如:筛选大于3的行NR>3
也可以采用正则匹配。
如:匹配正则:x~/正则/
不匹配正则:x!~/正则/
动作
打印print
和格式化打印printf