??在Linux中学会对文本的处理也是很重要的,对文本快速的过滤和查找,替换,编辑,可以大大地提高工作的效率,在编辑脚本时也可以灵活地运用,下面和大家介绍一下我们常用的文本处理工具。
grep:
??作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行。
??模式:由正则表达式字符及文本字符所编写的过滤条件。
选项:
-m # 匹配#次后停止
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
? -w 匹配整个单词
? -E 使用ERE
? -F 相当于fgrep,不支持正则表达式
? -f file 根据模式文件处理
格式:
grep [OPTIONS] PATTERN [FILE...]
匹配包含root的行:
grep “root” /etc/passwd
匹配不包含“root”的行:
grep -v “root” /etc/passwd
只输出匹配的部分:
echo this is a test line. | egrep -o "[a-z]+\."
结果 line
递归搜索文件
grep "text" . -r -n
#.当前目录下
忽略大小写:
echo "hello world" | grep -i "HELLO"
结果 hello
在grep搜索结果中包括或者排除指定文件:
#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}
#在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"
#在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist
打印出匹配文本之前或者之后的行:
#显示匹配某个结果之后的3行,使用 -A 选项:
seq 10 | grep "5" -A 3
5
6
7
8
#显示匹配某个结果之前的3行,使用 -B 选项:
seq 10 | grep "5" -B 3
2
3
4
5
#显示匹配某个结果的前三行和后三行,使用 -C 选项:
seq 10 | grep "5" -C 3
2
3
4
5
6
7
8
#如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
echo -e "a\nb\nc\na\nb\nc" | grep a -A 1
a
b
--
a
b
sed:Stream EDitor, 行编辑器
?sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时
缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的
内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。
如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清
空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重
定向存储输出。
?功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
用法:
sed [option]... ‘script‘ inputfile...?
常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i.bak 备份文件并原处编辑
script:
‘地址命令‘
sed工具
?地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#:指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行?
编辑命令:
d 删除模式空间匹配的行,并立即启用下一轮循环
p 打印当前模式空间内容,追加到默认输出之后
a []text 在指定行后面追加文本,支持使用\n实现多行追加
i []text 在行前面插入文本
c []text 替换行为单行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s/// 查找替换,支持使用其它分隔符,s@@@,s###
?替换标记:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
替换操作:s命令
替换文本中的字符串:
sed ‘s/book/books/‘ file
-n选项 和 p命令 一起使用表示只打印那些发生替换的行:
sed -n ‘s/test/TEST/p‘ file
直接编辑文件 选项-i ,会匹配file文件中每一行的第一个book替换为books:
sed -i ‘s/book/books/g‘ file
全面替换标记g
使用后缀 /g 标记会替换每一行中的所有匹配:
sed ‘s/book/books/g‘ file
当需要从第N处匹配开始替换时,可以使用 /Ng:
echo sksksksksksk | sed ‘s/sk/SK/2g‘
skSKSKSKSKSK
echo sksksksksksk | sed ‘s/sk/SK/3g‘
skskSKSKSKSK
echo sksksksksksk | sed ‘s/sk/SK/4g‘
skskskSKSKSK
定界符
以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符:
sed ‘s:test:TEXT:g‘
sed ‘s|test|TEXT|g‘
定界符出现在样式内部时,需要进行转义:
sed ‘s/\/bin/\/usr\/local\/bin/g‘
删除操作:d命令
删除空白行:
sed ‘/^$/d‘ file
删除文件的第2行:
sed ‘2d‘ file
删除文件的第2行到末尾所有行:
sed ‘2,$d‘ file
删除文件最后一行:
sed ‘$d‘ file
删除文件中所有开头是test的行:
sed ‘/^test/‘d file
匹配给定样式的其中一部分:
echo this is digit 7 in a number | sed ‘s/digit ([0-9])/\1/‘
this is 7 in a number
命令中 digit 7,被替换成了 7。样式匹配到的子串是 7,(..) 用于匹配子串,对于匹配到的第一个子串就标记为 \1 ,依此类推匹配到的第二个结果就是 \2 ,例如:
echo aaa BBB | sed ‘s/([a-z]+) ([A-Z]+)/\2 \1/‘
BBB aaa
love被标记为1,所有loveable会被替换成lovers,并打印出来:
sed -n ‘s/(love)able/\1rs/p‘ file
从文件读入:r命令
file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面:
sed ‘/test/r file‘ filename
写入文件:w命令
在example中所有包含test的行都被写入file里:
sed -n ‘/test/w file‘ example
追加(行下):a\命令
将 this is a test line 追加到 以test 开头的行后面:
sed ‘/^test/a\this is a test line‘ file
在 test.conf 文件第2行之后插入 this is a test line:
sed -i ‘2a\this is a test line‘ test.conf
插入(行上):i\命令
将 this is a test line 追加到以test开头的行前面:
sed ‘/^test/i\this is a test line‘ file
在test.conf文件第5行之前插入this is a test line:
sed -i ‘5i\this is a test line‘ test.conf
下一个:n命令
如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续:
sed ‘/test/{ n; s/aa/bb/; }‘ file
原文:https://blog.51cto.com/14322593/2400377