Linux文件处理三剑客
-
grep : 文本过滤工具
- 支持基础正则表达式
- -E 支持扩展正则表达式
- -F 支持快递过滤(在不匹配正则表达式的情况下)
- 其中有egrep,其不用-E参数,直接支持扩展正则表达式
- 其中有fgrep,其不用-F参数,直接支持快速搜索
sed : stream editor,流编辑器,使用-r参数,支持正则表达式
awk : linux上的实现为gawk,格式化输出文本,一般情况用于生成报告,且支持正则表达式
基本正则表达式(Basic regual expression,regexp)
基本正则表达式元字符
-
字符匹配
- . : 匹配任意单个字符
- [] : 匹配指定范围的任意字符
- [^] : 匹配指定范围外的任意字符
- [:upper:] [:lower:] [:alpha:] [:alnum:] [:digit:][:punct:] [:space:]
-
匹配次数
* : 匹配其前面的字符任意次,0次、1次或者多次;
* 例如:grep “xy”
abxy
aby
xxxxxy
yab
注意:匹配任意长度的任意字符,同glob里的号? : 匹配其前面的字符0次或1次,即前面的字符,可有可无;
* 例如:grep “x?y”
abxy
aby
xxxxxy
yab\+ : 匹配其前面的字符至少1次或多次,即前面的字符至少需要出现一次
* 例如:grep “x+y”
abxy
xxxxxy{m} : 匹配其前面的字符M次
{m,n} : 匹配其前面的字符至少M次,最多N次
{0,n} : 匹配其前面的字符最多N次
{m,} : 匹配其前面的字符至少M次
-
位置锚定
- ^ :锚定行首,用于模式的最左侧
- $ :锚定行尾,用于模式的最右侧
- \< 或者\b :锚定词首,用于单词的最左侧
- \> 或者\b :锚定词尾,用于单词的最右侧
-
分组及引用
- \( \) : 将一个或者多个字符捆绑在一起,当作一个整体
- \1,\2,\3... : 向后引用前面被匹配到的第一个、第二个、第三个...
- 注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,变量为\1,\2,\3....
扩展正则表达式元字符
-
字符匹配
- . : 任意单个字符
- [] : 指定范围内的任意字符
- [^] : 指定范围外的任意字符
-
次数匹配
- . : 任意次,匹配0次,1次或多次
- ? : 0次或者1次,表示前面的字符可有可元
- + : 其前面的字符最少一次,1次或者多次
- {m} : 匹配其前面的m次
- {m,n} : 匹配其前面的至少M次,至多N次
- {0,n} : 匹配其前面的最多N次
- {m,} : 匹配其前面的最少M次
-
位置锚定
- ^ :锚定行首,用于模式的最左侧
- $ :锚定行尾,用于模式的最右侧
- \< 或者\b :锚定词首,用于单词的最左侧
- \> 或者\b :锚定词尾,用于单词的最右侧
-
分组及引用
- \( \) : 将一个或者多个字符捆绑在一起,当作一个整体
- \1,\2,\3... : 向后引用前面被匹配到的第一个、第二个、第三个...
- 注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,变量为\1,\2,\3....
-
或
- | : 或者,或者整个左边和整个右边
- 例:
- a|b: a或者b
- C|cat :C或cat
- (C|c)at: 表示cat和Cat
- 例:
- | : 或者,或者整个左边和整个右边
练习:
找出/proc/meminfo文件中,所有以大写或小写s开头的行,至少三种实现方式
* cat /proc/meminfo | grep -E ‘^(s|S)’
* cat /proc/meminfo | grep ‘^[sS]’
* cat /proc/meminfo | grep -i ‘^s'显示当前系统上root、centos、或者user1用户的相关信息
*cat /etc/passwd | grep -E “^(root|centos|user1)\>"
找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
*cat /etc/rc.d/init.d/functions | grep -Eo “[_[:alnum:]]+\(\)"
使用echo命令输出一绝对路径,使用grep取出其基名
*ehco /etc/sysconfig/network-scripts/ifcfg-eth0 | grep -Eo "\<[^/]+/?$”
进一步:取出其路径名,类似于对其执行dirname命令的结果
* `echo /etc/sysconfig/network-scripts/ifcfg-eth0 | grep -o "^/.*/"找出ifconfig命令结果中的1-255之间的数值
*ifconfig | grep -E "[1-9]|[0-9][1-9]|1[0-9][0-9]|2[0-5][0-5]"
课外作业:找出ifconfig命令结果中的IP地址
添加用户bash,testbash,basher以及nologin(其shell为/sbin/nolgin);而后找出/etc/passwd文件用户名同shell名的行
*cat /etc/passwd | grep -E "^(\<.*\>):.*\1$”
*grep -E “^[^:]+\>” /etc/passwd
*grep -E “^([^:]+\>).*\1$” /etc/passwd
grep命令
-
grep - grep, egrep, fgrep - print lines matching a pattern
synopsis: grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] options: -e : 指定多个pattern -f : 把pattern放到文件里,从文件里读取 --color=auto : 对匹配到的文本高亮显示 -i : ignorecase,不区分大小写 -o : 只显示匹配到的本身 -v : --invert-match,反向显示,显示不能匹配到的行 -E : --extend-regexp,支持扩展正则表达式元字符 -F : 快速搜索,等于直接使用fgrep命令 -q : --quiet,--silent,静默模式,即不输出任何信息,一般在脚本中使用 -A # : (after)显示匹配到的行,后#行 -B # : (before)显示匹配到的行,前#行 -C # : (context),显示匹配到的行,前后各#行 -n : 显示行号
- 例: cat /etc/rc.d/init.d/functions | grep -E2 "^[_[:alnum:]]+\(\)"
- 解释:过滤functions文件中,以单词或者单词前面跟了一个"_"开头的行,并显示前后2行,这里的2相当于 -C 2,或者可以直接写成-2,
- 例: cat /etc/rc.d/init.d/functions | grep -E2 "^[_[:alnum:]]+\(\)"
练习:
- /etc/passwd文件中不以/bin/bash结尾的行
grep -v "/bin/bash" /etc/passwd
- 找出/etc/passwd文件中两位数或三位数
grep "\<\([[:digit:]]\)\{2,3\}\>" /etc/passwd
- 找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg g文件中,以至少一个空白字符开头,且后面存在非空白字符的行
grep "^[[:space:]]\+[^[:space:]]" /etc/grub.conf
- 找出netstat -tan命令的结果中以LISTEN后面跟0个、1个或者多个空白字符结尾的行
netstat -tan | grep "LISTEN[[:space:]]*”