【文本三剑客grep、sed、awk】

三剑客

所谓的三剑客指的就是grep、sed、awk,如果你要学会这三个工具,那么在文本处理中是非常得心应手的,接下来让我们一来学习一下。

一、grep的应用

1.grep的功能

简单来说grep适用于简单个过滤、匹配文件的关键字

2.grep的命令格式

grep -参数 “关键字” 文件名

3.grep的常用参数

  • grep -i 忽略字母大小写查找
  • grep -v 过滤取反
  • grep -n 带行号的查找
  • grep -w 以单词的形式精确匹配,不是模糊查找
  • grep -l 显示匹配内容的文件名,不显示内容
  • grep “” test 文件内容全部输出

4.grep 的升级egrep

egrep ==grep -E 表示grep的升级

  • egrep “r.” test(文件名) : 表示过滤r后面的第一个字符
  • egrep “r. .”test 表示过滤r后面的两个字符
  • egrep “ro*” test 重复*前面字符
  • egrep “.*” -n test 重复任意所有字符, -n 显示行号
  • egrep “[ 3,6]” test 匹配有3和6的内容 同[3,6^]意义一样
  • egrep "[^ 3, 6 ] " test 取反 匹配没有3并且没有6的内容(出来的数据不可能同时包含3和6)
  • egrep “^ [3,6 ]” test 匹配有3和6开头的
  • egrep "b | c " test 匹配有b或者c 这个单词

5.grep的日常操作

grep "" test   #文件内容全部输出
grep "4" test #模糊查找,有关4的全部查找
ls | grep -v "test4" | xargs rm -rf  #先查看当前目录下面是否有test4这个文件,然后取反最后删除
grep -v "22" test   #查看test1文件中除与“22”有关的所有文件内容。  -v  取反
rm -rf ` ls | grep -v "3" `   # (内容必须在当前路径)

6.用到的基本常识

  • \cp 强制覆盖
  • 点(.) 在正则表达式里默认表达任意的一个字符
  • *重复前面字符,0到无限次
  • +匹配前一个字符1次到多次
  • | 正则里表达或者
  • [ abc ] 中括号表示匹配中括号里边的任意的字符一次
  • \ 转行符,正则式里表示转义符
  • alias egrep = ‘egrep --color =auto’ 使得egrep过滤出来的文本会有颜色,方便识别
  • alias grep = ‘grep --color =auto’ 使得grep过滤出来的文本会有颜色,方便识别

二、sed的应用

1.sed的功能

一般是用来找到文件里的内容去修改或者替换

2.sed的命令格式

sed -参数 ‘定义取值的条件’ 文件名

3.sed的常用参数

  • -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
  • -r:支持扩展的正则表达式
  • -i:直接将处理的结果写入文件

4.sed的日常操作

sed '' test1  #查看test1文件所有内容
sed '6p' test1   #复制test1 文件中第6行的内容
sed  -n '6p'  test1  #输出test1文件中行数为6的内容。
sed '/6/p' test1   #复制test1 文件中与6有关的内容(所有带6的内容都复制)
sed   -n '/4/p' test1  #只输出test1文件中每行带有4的内容 
sed  '/6/d'  test1   #不输出所有带6的内容
sed  '6d'  test1   #不输出test1 文件中第6行的内容
sed -n '2p;5p' test1  #输出第2行和第5行内容
sed '5i fffffff' test1  #在第5行上插入内容
sed '5a fffffff' test1    #a  在第5行下插入内容
sed '3,5a fffffff' test1   # 3-5行下边插入内容
sed 's#fff#ggg#' test1   #文件里的fff 替换为 ggg
sed 's#^#********#' test  # 每一行的开头插入
sed '3,5s#^#********#' test  #3-5行开头插入
sed '3,5s#$#********#' test   #3-5 行结尾插入

5.sed的经典用法

[root@xph ~]# ifconfig ens32 |egrep -o "[0-9.]{15}"|head -1
192.168.200.140
[root@xph ~]# ifconfig ens32 | sed -n '2p'| sed 's#.*inet##'|sed 's#netmask.*##'
192.168.200.140
[root@xph ~]# ifconfig ens32 | sed -n '2p'| sed -r 's#.*inet (.*)  netmask.*#\1#'
192.168.200.140

批量修改文件名
[root@xph sjk]# ls -l
afj_gdsdgs_sdfds.jsp
afj_gdsdgs_dsfds.jsp
[root@xph sjk]# find -type f -name "*.jsp"|sed -r 's#(.*)_gdsdgs(.*)# mv \0 \1\2 #'|bash
[root@xph sjk]# ls
afj_dsfds.jsp  afj_sdfds.jsp

把文件中除了字母的其他字符全部替换为空格。
root@xph sjk]#  sed -r 's#[^A-Za-z]+# #g' /etc/passwd  > test
#+ 表示把连续多个空格当成一个空格处理

三、awk的应用

1.awk的功能

awk不只是一个强大的文本分析工具也可以说他是一种编程语言,我们初学者如果说sed只能对文本行进行操作,那么awk就可以认为不只是对行进行操作,也能对列进行操作

2.awk的命令格式

awk 参数 条件 目标路径 #这么看估计初学者都蒙,那就具体看看下面的日常操作吧

awk的条件里,又分为两部分:模式/动作
awk的动作,是按列切割文本。也就是竖着
如果不加参数,默认按空格区分一列。分列符号=空格
如果只有模式,没有动作,默认输出所有列
如果只有动作,没有模式,默认输出所有行
如果模式动作都有,则模式在前动作在后
先进行横向切割,在横向切割的基础上,在进行纵向切割

3.详细的awk 命令执行过程

  • 开始模块:BEGIN{内容} 模式{动作} END{内容}
  • 模式和动作,是处理文件的过程。目标文件,先要读取到内存中。然后才是处理文件的过程
  • BEGIN模块决定了awk,要如何读取文件。
  • END模块,结束模块,在处理完毕文件之后。在结束
  • 开始模块,开头; 模式和动作 过程 ; END是结尾。

4.awk的常用参数

  1. -F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F : 。
  2. -v var=value or --asign var=value 赋值一个用户定义变量。
  3. -f scripfile or --file scriptfile 从脚本文件中读取awk命令。

5.awk的日常操作

5.1 获取都系统IP地址
[root@xph ~]# ifconfig ens32| awk -F "[ ]+" 'NR==2{print$3}'
192.168.200.140

5.2 以默认以空格为间隔,输出文本内容的第二列
[root@xph sjk]# awk '{print$2}' test1

5.3 4到9行里找1,3,5列;$0代表所有列
[root@xph sjk]# awk 'NR>4&&NR<9 {print $1,$3,$5}' test1

5.4 有多少行就输出多少行a,这里a=1,所有输出结果为1
[root@xph sjk]# awk 'BEGIN{a=1}{print a}' test1

5.5 a 自增,有多少行a自增到几
[root@xph sjk]# awk 'BEGIN{a=0}{a=a+1;print a}' test1
1
2
3
4
5
6
7
8
[root@xph sjk]#

5.6 加END只输出最后的结果
[root@xph sjk]# awk 'BEGIN{a=0}{a=a+1} END {print a}' test1
8
[root@xph sjk]#

5.7  RS读入换行符,可修改默认的换行符,默认换行为\n,$0 输出所有列
[root@xph sjk]# cat test2
wE rwQ rwT rwG rwV r
[root@xph sjk]# awk 'BEGIN{RS="w"}{print NR,$0}' test2
1
2 E r
3 Q r
4 T r
5 G r
6 V r

[root@xph sjk]#

5.8 ORS输出换行符,输出自定义追加的换行符 以W开头,%去结尾
[root@xph sjk]# cat test2
wE rwQ rwT rwG rwV r
[root@xph sjk]#  awk 'BEGIN{RS="w";ORS="%"}{print NR,$0 }' test2
1 %2 E r%3 Q r%4 T r%5 G r%6 V r
%[root@xph sjk]#

5.9 我要计算的是,每行的第二列的数字之和。
[root@xph sjk]# cat test
2 3 5
4 5 6
45 54 67
[root@xph sjk]# awk '{a=a+$2}END {print a}' test
62
[root@xph sjk]#

5.10 特别注意awk中的数组是一对多赋值
[root@xph sjk]# awk 'BEGIN {h[2]="nih";h[3]="kjdf";h[4]="sdkj";print h[2],h[3],h[4]}'
nih kjdf sdkj
5.11  经典面试题(一):按单词出现频率降序排序(计算文件中每个单词的重复数量)
[root@xph ~]# cat test | xargs -n 1 | sort | uniq -c |sort -rn
# xargs -n 1   按照单词数排行,-n 1   每行一个单词;-n 2每行两个单词
# sort默认排序,排的是第一列并且是按照字母顺序排序,如果有大小写字母则先排大写字母后排小写字母;如果是数字是按照从小到大排序
# sort -n  按照数字顺序排序
# sort -k2 按照第二列内容排序 -k3  按照第三列内容排序, 不写k 默认按照k1排序
# sort -rn 按照数字顺序并且逆转排序,第一列
# uniq 邻近的相同的单词。去重复
# uniq -c  去重复的同时,计数,计算去掉了多少个重复的。

5.11 经典面试题(二)awk主要功能去重计数
处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)
http://www.etiantian.org/1.html 364
http://post.etiantian.org/index.html 754
http://mp3.etiantian.org/index.html 3453
http://post.etiantian.org/2.html 45643
http://www.etiantian.org/1.html 43543
http://post.etiantian.org/index.html 3453
http://mp3.etiantian.org/index.html 436
http://post.etiantian.org/2.html 34534
方式一:
[root@xph sjk]# awk -F "[/ ]+" '{h[$2]=h[$2]+1;s[$2]=s[$2]+$4}END{for(i in s)print i,s[i],h[i]}' test1
mp3.etiantian.org 3889 2
www.etiantian.org 43907 2
post.etiantian.org 84384 4
方式二:
[root@xph sjk]# awk -F "[/]+" '{h[$2]++};END {for(i in h)print i,h[i]}' test1
mp3.etiantian.org 2
www.etiantian.org 2
post.etiantian.org 4

5.12 awk必须会用的

[root@xph sjk]# awk ''  test1  #不输出test1文件中的所有
[root@xph sjk]# awk '/6/' test1  #只输出test1文件中所有包含6的内容
[root@xph sjk]# awk '! /6/' test1 #输出不包含6的所有内容      !  :取反
[root@xph sjk]# awk 'NR==4' test1  # 只输出test1 文件的第4行内容
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值