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)内容如下:

    
      repo
      next/openEuler/opencc
    


    
      repo
      next/openEuler-20.03/zip
    

  • 找出文档中所有含有next的行
    grep next grep_doc.txt
    结果如下:
[root@ds-dj docs]# grep next grep_doc.txt
      next/openEuler/opencc
      next/openEuler-20.03/zip
[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
      next/openEuler-20.03/zip
[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

    
      repo
      text/openEuler/opencc
    


    
      repo
      text/openEuler-20.03/zip
    

[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

    
      repo
      openEuler/opencc
    


    
      repo
      openEuler-20.03/zip
    

[root@ds-dj docs]#

你可能感兴趣的:(记录)