grep 基本正则表达式 BRE
参数 说明
-b 将二进制文件作为文本来进行匹配
-c 统计以模式匹配的数目
-i 忽略大小写
-n 显示匹配文本所在行的行号
-v 反选,输出不匹配行的内容
-r 递归匹配查找
-A n n 为正整数,表示 after 的意思,除了列出匹配行之外,还列出后面的 n 行
-B n n 为正整数,表示 before 的意思,除了列出匹配行之外,还列出前面的 n 行
--color=auto 将输出中的匹配项设置为自动颜色显示
任意数量
# 将匹配以'z'开头以'o'结尾的所有字符串
echo 'zero
zo
zoo' | grep 'z.*o'
# 将匹配以'z'开头以'o'结尾,中间包含一个任意字符的字符串
echo 'zero
zo
zoo' | grep 'z.o'
# 将匹配以'z'开头,以任意多个'o'结尾的字符串
echo 'zero
zo
zoo' | grep 'zo*'
特定字符
# grep默认是区分大小写的,这里将匹配所有的小写字母
echo '1234
abcd' | grep '[a-z]'
# 将匹配所有的数字
echo '1234
abcd' | grep '[0-9]'
# 将匹配所有的数字
echo '1234
abcd' | grep '[[:digit:]]'
# 将匹配所有的小写字母
echo '1234
abcd' | grep '[[:lower:]]'
# 将匹配所有的大写字母
echo '1234
abcd' | grep '[[:upper:]]'
# 将匹配所有的字母和数字,包括0-9,a-z,A-Z
echo '1234
abcd' | grep '[[:alnum:]]'
# 将匹配所有的字母
echo '1234
abcd' | grep '[[:alpha:]]'
# 标点符号
echo '12!34
abc.?d' | grep '[[:punct:]]'
特殊符号说明:
[:alnum:] 代表英文大小写字母及数字,亦即 0-9, A-Z, a-z
[:alpha:] 代表任何英文大小写字母,亦即 A-Z, a-z
[:blank:] 代表空白键与 [Tab] 按键两者
[:cntrl:] 代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等
[:digit:] 代表数字而已,亦即 0-9
[:graph:] 除了空白字节 (空白键与 [Tab] 按键) 外的其他所有按键
[:lower:] 代表小写字母,亦即 a-z
[:print:] 代表任何可以被列印出来的字符
[:punct:] 代表标点符号 (punctuation symbol),亦即:" ' ? ! ; : # $...
[:upper:] 代表大写字母,亦即 A-Z
[:space:] 任何会产生空白的字符,包括空白键, [Tab], CR 等等
[:xdigit:] 代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字节
排除字符^
echo 'geek
good' | grep '[^o]'
当^放到中括号内为排除字符,否则表示行首。
echo 'geek
good' | grep '^g'
egrep 扩展正则表达式 ERE
要通过grep使用扩展正则表达式需要加上-E参数,或使用egrep
egrep [范本模式] [文件或目录]
# 只匹配"zo"
echo 'zero
zo
zoo' | grep -E 'zo{1}'
# 匹配以"zo"开头的所有单词
echo 'zero
zo
zoo' | grep -E 'zo{1,}
# 匹配"www.aaa.com"和"www.google.com"
echo 'www.aaa.com
www.baidu.com
www.google.com' | grep -E 'www.(aaa|google).com'
# 或者匹配不包含"baidu"的内容
echo 'www.aaa.com
www.baidu.com
www.google.com' | grep -Ev 'www.baidu.com'
nl
nl命令在linux系统中用来计算文件中行号,可以将输出的文件内容自动的加上行号
sed 流编辑器
sed工具在 man 手册里面的全名为"sed - stream editor for filtering and transforming text ",意即,用于过滤和转换文本的非交互式流编辑器。
sed [参数]... [执行命令] [输入文件]...
参数 说明
-n 安静模式,只打印受影响的行,默认打印输入数据的全部内容
-e 用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令通常不需要加该参数
-f filename 指定执行 filename 文件中的命令
-r 使用扩展正则表达式,默认为标准正则表达式
-i 将直接修改输入文件内容,而不是打印到标准输出设备
增删
# 删除第二行
nl /etc/passwd | sed '2d'
# 删除第三到最后一行
nl /etc/passwd | sed '3,$d'
# 在第二行后(亦即是加在第三行)加上『abc』
nl /etc/passwd | sed '2a abc'
# 加在第三行前
nl /etc/passwd | sed '3i abc'
# 增加多行
nl /etc/passwd | sed '2a abc
def'
替换
# 将2-5行的内容替换为abc
nl /etc/passwd | sed '2,5c abc'
过滤打印
# 将5-7行内容打印
nl /etc/passwd | sed -n '5,7p'
数据的搜索
# 搜索有root关键字的行
nl /etc/passwd | sed '/root/p'