shell中用到的grep、awk、sed

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]#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值