一、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]} }'