一、grep
grep [选项] ‘模式’ 文件
选项:
-o:仅显示匹配到的行
-v:仅显示未匹配到的行
-q:静默模式,不输出信息
-i:忽略大小写匹配
-A #:多匹配后#行
-B #:多匹配前#行
-C #:多匹配前后#行
-E:使用扩展正则表达式
--color=auto:匹配到的内容自动着色
模式:
单个字符匹配:
.:单个任意字符
[]:范围内的字符,如[a-z],[0-9]等
[^]:取反
常用字符集:[:digit:],[:lower:],[:alpha:],[:upper:],[:space:],[:alnum:]
匹配次数:
\*:匹配前面字符任意次
.*:任意长度的任意字符
\?:匹配前面字符0或1次
\+:匹配前面字符至少一次
\{n\}:匹配前面字符n次
\{n,m\}:匹配前面字符至少n次,最多m次
\{n,\}:匹配前面字符最少n次
位置锚定:
^:行首
$:行尾
\<:词首
\>:词尾
分组:
\(\):将匹配条件写在括号内,后可以使用\1,\2引用
文件:可跟文件名或使用管道符作为标准输入
例子: 匹配1-255之间的数字
# ifconfig | grep -o --color=auto '\<\([1-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>'
扩展正则表达式:
egrep [选项] ‘模式’ 参数
与标准正则表达式相比,除词首词尾锚定外,均不需要 \ 转译,但仍然使用 \# 来引用前面第#个( )内匹配到的内容。
上面例子使用扩展正则表达式如下
ifconfig | egrep -o --color=auto '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
二、sed
行编辑器,从文件或标准输入逐行读取内容到模式空间,根据命令对此作出相应处理。另外还有保持空间可以提供一个缓冲区,可利用此缓冲区与模式空间结合使用进行更高级的控制。
sed [选项] ‘脚本’ 文件
选项:
-n:不输出信息至屏幕
-f /PATH:从指定路径读取脚本文件进行处理
-i:直接编辑源文件
-r:支持扩展正则表达式
脚本:‘AddressCommand’
地址:不给地址,则表示默认所有行
#:特定某一行
/pattern/:被模式匹配到的所有行
#,#:从某一行到某一行
/pat1/,/pat2/:从第一次被pat1匹配到的行到之后第一次被pat2匹配到的行
#,+#:从某行到后面的几行
1~2:步进,从1行开始,每两行读取一次
注:灵活组合使用,不仅限于此
命令:
d:删除
p:显示模式空间中的行
a \STRING:在行后追加行,支持\n多行追加
i \STRING:在行前插入行,支持\n
w /PATH:模式空间的行写入文件
r /PATH:将文件读入到模式空间的行后
!:取反条件
s///:查找替换,支持g,p,w /PATH
=:打印行号
高级编辑命令:
n:读取下一行覆盖至模式空间中
N:读取下一行追加至模式空间中
g:从保持空间读取内容覆盖至模式空间
G:从保持空间读取内容追加至模式空间
h:模式空间内容覆盖至保持空间
H:模式空间内容追加至保持空间中
x:模式空间与保持空间内容互换
D:删除多行模式空间中的所有行
例子:
sed -n 'n;p' /etc/passwd #显示偶数行
sed -n '1!G;h;$p' /etc/passwd #逆序打印文本内容
sed '$!N;$!D' #取出最后两行
三、gawk
gawk [选项] ‘程序’ 文件
选项:
-v:定义变量或内建变量赋值
-F ' ':指定输入分隔符,等同于-v FS=' '
内建变量:
FS:输入分隔符变量,默认为空格
OFS:输出分隔符变量,默认为空格
RS:输入换行符
ORS:输出换行符
NF:字段数量
NR:行号,多文件时一并统计
FNR:行号,多文件时分别统计
FILENAME:当前文件名
ARGC:命令参数个数
ARGV:命令参数数组
程序:包含了地址定界和程序本身
地址定界:
BEGIN{ }:文本处理之前执行{ }里的代码
END{ }:文本处理完成之后执行{ }里的代码
/PATTERN/{ }:仅对匹配到的行执行{ }里的代码
/PATTERN1/,/PATTERN2/{ }:对第一次被PATTERN1匹配到的行至之后第一次被PATTERN2匹配到的行之间所有行执行{ }里的代码
程序:
{print item1 item2} #引用字段使用$1 ,$2等,引用变量不需$
print NF #打印当前行字段数量
print $NF #打印当前行最后字段
{printf "格式控制",变量表列} #参考c语言printf函数用法,支持 %-10s,%3.1f 这类用法
{selector?statment1:statment2} #参考c语言用法,相当于if语句
注:选择结构:if-else,switch-case。参考c语言选择结构的用法
循环结构:while,do-while,for。参考c语言中循环结构的用法
对于数组:使用for(varName in arrayName){ },使变量遍历数组所有元素下标进行操作
关联数组:使用字符串索引数组元素。如 array["str"]=1,可利用此特性统计字符串、数值等值重复次数
算术运算:+,-,*,/,%,^,++,--
赋值运算:=,+=,-=,*=,/= 等
数值比较:>,>=,==,<,<=
循环支持 break 与 continue,另外,使用 next 提前结束当前行进入下一行操作
常用函数:length(strName),返回字符串长度;
split(strName, arrayName, r),以r为分隔符分割字符串strName并保存结果至arrayName数组
例子: 统计ss -tan命令显示结果中各种状态出现的次数
ss -tan | gawk 'BEGIN{print "Result:"} {if(NR==1){next};count[$1]++} END{ for(i in array){print i,array[i]} }'