linux上文本处理三剑客
grep,sed和awk都是文本处理工具,虽然都是文本处理工具但却都有各自的优缺点,一种文本处理命令时不能被另一个完全替换的,否则也不会出现三个文本处理命令了。
grep:stream editor,文本过滤器,如果仅仅是过滤文本,可使用grep,其效率要比其他的高很多;
sed:Stream EDitor,流编辑器,默认只吃力模式空间,不处理原数据,针对行进行处理;
awk:报告生成器,格式化以后显示。如果对处理的数据需要生成报告之类的信息,或者你处理的数据是按列进行处理的,最好使用awk。
grep
Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式“对文本主行进行匹配,打印匹配到的行;
模式:由正则表达式字符及文本字符所编写的过滤条件;
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些不表示字符字面意义,而标示控制或统配的功能;
grep [options] pattern [file]
选项:
--color=auto:对匹配到的文本进行着色显示;
-v:显示不能被pattern匹配到的行;
-i:忽略字符大小写;
-o:仅显示匹配到的字符串
-q:静默模式,不输出任何信息;
-A #:after,后#行;
-B #:before。前#行;
-C #:context,前后各#行;
基本正则表达式元字符:
字符匹配:
. 匹配任意单个字符;
[] 匹配指定范围内的任意单个字符;
[^] 匹配指定范围外的任意单个字符;
[:digit:] [:lower:] [:upper:] [:alpha:] [:punct:] [:space:]
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数;
*:匹配前面的字符任意次;
例如:grep “x*y“
abxy
xay
xxxxxxy
贪婪模式
.*:任意长度的任意字符;
\?:匹配其前面的字符0或1次,即前面的字符可有可无;
\+:匹配其前面的字符至少一次
\{m}:匹配前面的字符m次
\{m,n\}:匹配前面的字符至少m次,至多n次;
\{0,n\}:匹配前面的字符至多n次;
\{m,\}:匹配前面的字符至少m次;
位置锚定:
^: 行首锚定;用于模式的最左侧;
$: 行尾锚定;用于模式的最右侧;
^PATTERN$: 用于模式匹配整行;
^$ ^[[:space:]]*$
\< 或 \b:词首锚定;用于单词模式的左侧;
\> 或 \b:词尾锚定;用于单词模式的右侧;
\<PATTERN\>:匹配整个单词;
分组:
\(\): 将一个或多个字符捆绑在一起,当作一个整体进行处理;
\(xy\)*ab
Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1 \2 \3..
\1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
\(ab\+\(xy\)*\):
\1: ab\+\(xy\)* \2: xy
后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)
练习:
1 显示/proc/meminfo文件中以大小s开头的行;
grep -i '^s' /proc/meminfo
grep ^[sS] /proc/meminfo
grep -e ^s -e ^S /proc/meminfo
2 显示/etc/passwd文件中不以/bin/bash结尾的行;
grep -v '/bin/bash$' /etc/passwd
3 显示/etc/passwd文件中ID号最大的用户的用户名;
sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1
4 如果root用户存在,显示默认的shell程序;
grep '^root' /etc/passwd | cut -d: -f7
5 找出/etc/passwd中的两位或三位数;
grep '\<[[:digit:]]\{2,3\}\>' /etc/passwd
6 显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存在非空白字符的行;
grep '^[[:space:]]\+[^[:space:]]' /etc/rc.d/rc.sysinit
7 找出“netstat -tan“命令的结果中以“LISTEN“后跟0,1或多个空白字符结尾的行;
netstat -tan | grep 'LISTEN[[:space:]]*$'
8 添加用户bash,testbash,bashrc以及noligin(其shell为/sbib/nologin);而后找
出/etc/passwd文件中用户名同shell名的行;
grep '^\(\<[[:alnum:]]\+\>\).*/\1$' /etc/passwd