shell中用到的grep、awk、sed
grep
基于正则表达式搜索满足条件的行,可以实现数据查找定位。
指令
grep 常见指令
grep pattern file
grep -i pattern file 忽略大小写
grep -v pattern file 不显示匹配的行
grep -o pattern file 把每个匹配的内容用独立的行显示
grep -E pattern file 使用扩展正则表达式
grep -A -B -C pattern file 打印命中数据的上下文
grep pattern -r dir / 递归搜索
pattern正则表达式
- 基本表达式(BRE)
^开头 &结尾
[a-z][0-9]区间
- 0个或多个
- 基本正则(BRE)与扩展正则的区别(ERE)
?:非贪婪匹配
+:1个或者多个
() : 分组
{} : 范围约束
| :匹配多个表达式的任何一个
举例
- 举例文档(grep_doc.txt)内容如下:
<services>
<service name="tar_scm_kernel_repo">
<param name="scm">repo</param>
<param name="url">next/openEuler/opencc</param>
</service>
</services>
<services>
<service name="tar_scm_kernel_repo">
<param name="scm">repo</param>
<param name="url">next/openEuler-20.03/zip</param>
</service>
</services>
- 找出文档中所有含有next的行
grep next grep_doc.txt
结果如下:
[root@ds-dj docs]# grep next grep_doc.txt
<param name="url">next/openEuler/opencc</param>
<param name="url">next/openEuler-20.03/zip</param>
[root@ds-dj docs]#
- 找出所有的关键字next
grep -o next grep_doc.txt
结果如下:
next
next
- 找出带有数字的行
grep "[0-9]" grep_doc.txt
结果如下:
[root@ds-dj docs]# grep "[0-9]" grep_doc.txt
<param name="url">next/openEuler-20.03/zip</param>
[root@ds-dj docs]#
- 找出所有的数字
grep -o "[0-9]" grep_doc.txt
结果如下:
[root@ds-dj docs]# grep -o "[0-9]" grep_doc.txt
2
0
0
3
[root@ds-dj docs]#
awk
根据定位到的数据行处理其中的分段。主要用于文本内容的分析处理,也常用于处理数据,生成报告,非常适用于需要按列处理的数据。
指令
awk常见指令
awk ‘pattern{action}’
awk ‘/BEGIN{}END{}’ 开始和结束
awk ‘/Running/’ 正则匹配
awk ‘/aa/,/bb/’ 区间选择
awk ‘$2~/xxx/’ 字段匹配
awk ‘NR==2’ 取第二行
awk ‘NR>1’ 去掉第一行
awk字段数据处理
-F 参数指定字段分隔符
BEGIN{FS="_"} 也可以表示分隔符
$0 代表原来的行
$1 代表第一个字段
$N 代表第N个字段
$NF 代表最后一个字段
awk行处理
把单行分拆为多行
echo $PATH | awk 'BEGIN{RS=":"}{print $0}'
echo $PATH | awk 'BEGIN{RS=":"}{print NR,$0}'
echo $PATH | awk 'BEGIN{RS=":"}END{print NR}'
把多行组合为单行
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGING{FS="\n";ORS=":"}{print $0}'
sed
stream editor。根据定位到的数据行修改数据。主要用于文本内容的编辑,默认只处理模式空间,不改变原数据,而且sed使用逐行读取的方式处理数据。
指令
sed常见指令
sed [addr]X[options]
-e 表达式
sed -n ‘2p’ 打印第二行
sed ‘s#hello#world#’ 修改
-i 直接修改源文件
-E 扩展表达式
–debug 调试
pattern表达式
20 30,35 行数与行数范围
/pattern/ 正则匹配
//,// 正则匹配的区间
action
d 删除
p 打印,通常结合-n参数
s/REGEXP/REPLACEMENT/[FLAGS]
替换时引用\1\2匹配的字段
举例
- 替换文本中所有的next字段为text
sed -i 's#next#test#/g'
结果如下:
[root@ds-dj docs]# sed -i 's#next#text#' grep_doc.txt
[root@ds-dj docs]# cat grep_doc.txt
<services>
<service name="tar_scm_kernel_repo">
<param name="scm">repo</param>
<param name="url">text/openEuler/opencc</param>
</service>
</services>
<services>
<service name="tar_scm_kernel_repo">
<param name="scm">repo</param>
<param name="url">text/openEuler-20.03/zip</param>
</service>
</services>
[root@ds-dj docs]#
- 删除文本中所有的text/
sed -i 's#text/##'
结果如下:
[root@ds-dj docs]# sed -i 's#text/##' grep_doc.txt
[root@ds-dj docs]# cat grep_doc.txt
<services>
<service name="tar_scm_kernel_repo">
<param name="scm">repo</param>
<param name="url">openEuler/opencc</param>
</service>
</services>
<services>
<service name="tar_scm_kernel_repo">
<param name="scm">repo</param>
<param name="url">openEuler-20.03/zip</param>
</service>
</services>
[root@ds-dj docs]#