标签搜索

Linux三剑客【grep、sed、awk】-01

lilymaxyz
2024-07-03 / 0 评论 / 51 阅读 / 正在检测是否收录...

Linux三剑客【grep、sed、awk】-01

Linux三剑客是什么?

linux中的文本处理三剑客分别是grep、awk、sed,它们都以正则表达式作为基础,而在Linux系统中,支持两种正则表达式,分别为"标准正则表达式"和"扩展正则表达式",正则表达式的内容我们后续会讲,首先我们先明确一下三剑客的特点及应用场景,如下表所示:

命令特点应用场景
grep文本过滤包括从文件中进行过滤和从标准输入进行过滤,其过滤速度最快
sed取行文件内容新增、删除、替换、取出某个范围的内容
awk取列编写awk脚本对文本进行格式化输出(可进行统计计算)
  • grep:主要用于文本内容查找,支持正则表达式。
  • sed:主要用于文本内容的编辑,默认只处理模式空间,不改变原数据,而且sed使用逐行模式读取的方式处理数据。
  • awk:主要用于文本内容的分析处理,也常用于处理数据,生成报告,非常适用于需要按列处理的数据。

grep-搜索指定的内容

grep命令用于在文本文件中搜索指定的内容,并返回匹配的行。以下是grep命令的10个用法案例:

含义表达式
搜索包含指定关键词的行grep "keyword" file.txt
忽略大小写的关键词grep -i "keyword" file.txt
不显示匹配的行grep -v "keyword" file.txt
统计匹配行的数量grep -c "keyword" file.txt
显示匹配行之前的内容grep -B 2 "keyword" file.txt
显示匹配行之后的内容grep -A 2 "keyword" file.txt
显示匹配行及其上下文的内容grep -C 2 "keyword" file.txt
把每个匹配的内容用独立的行显示grep -o "keyword" file.txt
递归搜索目录 及其子目录下的文件grep -r "keyword" directory
使用扩展正则表达式进行高级搜索grep -E "pattern" file.txt
  • grep示例Shell脚本代码
ps -ef | grep bash
echo "ABC" | grep -i abc
ps -ef | grep bash | grep -v bash
echo "1234 7654" | grep -o "[0-9]4"
echo "1234 7654" | grep -oE "[0-9]4|76"
  • grep实战演练题目

    • 找出nginx.log中所有404和503报错的log数据,取出前3条数据,把命令贴到回复里。
    • 找出testerhome首页的所有http和https的链接。

sed-流式编辑

sed命令用于对文本进行流式编辑,可以进行替换、删除、插入等操作。以下是sed命令的10个用法举例:

含义表达式
替换文本中的指定字符串sed 's/old/new/' file.txt
替换文本中的所有匹配字符串sed 's/old/new/g' file.txt
删除匹配指定模式的行sed '/pattern/d' file.txt
删除空白行sed '/^$/d' file.txt
在匹配行之前插入新行sed '/pattern/i new line' file.txt
在匹配行之后插入新行sed '/pattern/a new line' file.txt
仅打印匹配的行sed -n '/pattern/p' file.txt
仅打印指定行范围内的内容sed -n '2,5p' file.txt
将文本中的所有字母转为大写sed 's/[a-z]/\U&/g' file.txt
将文本中的所有字母转为小写sed 's/[a-z]/\L&/g' file.txt
  • sed pattern表达式

    • 20,30,35 行数与行数范围
    • /pattern/正则匹配
    • //,//正则匹配的区间
  • action

    • d删除
    • p打印,通常结合-n参数
    • s/REGXP/REPLACEMENT/[FLAGS]
    • 替换时引用\1 \2 匹配的字段
  • sed示例Shell脚本代码
ps | sed -n 1,3p

ps | sed 's/CMD/command/'

ps | sed -n '/ps/p'

echo '1
2
3
4
5' | sed -n '/3/,/4/p'

echo '1
2
3
4
5' | sed '/3/,/4/d'

ps | sed -e 's/CMD/command/' -e 's#00#20#g'

awk-文本处理

awk命令式一种强大的文本处理工具,可以根据指定的规则从文本中提取信息并进行处理。以下是awk命令的10个用法举例:

含义表达式
打印指定列的内容awk '{print $1}' file.txt
根据指定的分隔符切割文本并打印指定列awk -F',' '{print $2}' file.txt
根据指定条件筛选行并打印awk '/pattern/{print}' file.txt
计算指定列的总和awk '{sum+=$1}END{print sum}' file.txt
根据指定条件进行行和列的求和awk '{rowsum+=$1;colsum+=$2}END{print rowsum,colsum}' file.txt
根据 指定条件进行行的分组并计数awk '{count[$1]++}END{for (item in count) print item,count[item]}' file.txt
根据指定条件进行行的分组并求平均值awk '{sum[$1]+=$2;count[$1]++}END{for (item in sum)print item,sum[item]/count[item]}' file.txt
格式化输出awk '{print "%-10s %-5d\n",$1,$2}' file.txt
自定义变量 并进行计算awk 'BEGIN{x=5;y=10;print x+y}'
执行自定义函数awk 'function myfunc(x) {return x*2}{print myfunc($1)}' file.txt
  • awk pattern语法

    • awk理论上可以代替grep
    • 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=":"} {print NR}'
    • 多行组合为单行

      • echo $PATH | awk 'BEGIN{RS=":"} {print $0}' | awk 'BEGIN{FS="\n";ORS=":"} {print $0}'
  • awk示例Shell脚本代码
ps | awk 'BEGIN{print "start"} {print $0} END {print "end"}'

awk '/404 | 500 /'  /usr/local/nginx/log/nginx.log

echo '1
2
3
4
5' | awk '/2/,/4/'

echo '1
2
3
4
5' | awk '$0>3'

ps | awk 'NR>1'

ps | awk '{print $NF}'

echo $PATH | awk 'BEGIN{RS=":"} {print $0}' | grep -v "^$" | awk 'BEGIN{FS="\n";ORS=":"} {print $0} END {printf "\n"}'

echo '1,10
2,20
3,30' | awk 'BEGIN{a=0;FS=","} {a+=$2} END {print a,a/R}'

awk 'BEGIN{print 33*20*76/200/3}'

echo "123|456_789" | awk 'BEGIN{FS="\\||_"} {print $2}'

echo "123|456_789" | awk 'BEGIN{FS=\"\\\\||_\"} {print  \$2}'  #尽量使用单引号

awk实战演练题目

  • 找出404和503的数据,只打印状态码这一列,然后排序去重,把命令贴到回复里。
  • 找出testerhome首页找到所有的http的链接,然后打印不带http的纯域名部分。

endl

0

评论

博主关闭了所有页面的评论