Linux文本处理三剑客

概述

        Linux文本处理三剑客是指grep、sed、awk三个强大的文本处理工具         

1.grep

        用于在文本中搜索指定模式的行,并输出符合条件的行    

2.sed

        用于对文本进行流式编辑,可以进行文本替换、删除、插入等操作

3.awk

        强大的文本处理工具,可以根据指定的规则对文本进行处理和格式化

 正则表达式

#三个文本处理器都支持使用正则表达式

# ^    行首,代表开头        $    行尾,代表结束
^ftx                   #匹配以ftx开头的字符串
ftx$                   #匹配以ftx结尾的字符串
^ftx$                  #只能匹配字符串ftx

# .    匹配任意单个字符
f.x                    #匹配ftx,也可以匹配fax、fbx、f1x等等格式的字符串

# *    表示前面的字符或子模式出现0次或多次
f*tx                   #匹配tx或tx前任意数量f的字符串,例如ftx、fftx等

# ?    表示前面的字符或子模式出现0次或1次
f?tx                   #匹配tx或ftx

#[]    匹配集合内的任意单个字符   加上^则代表取反
[abc]ftx               #匹配aftx、bftx、cftx 
[^abc]ftx              #除了abc之外任意字符加上ftx都可以匹配

# -    表示一个范围,例如a-z,A-Z,0-9    
[a-z]                  #匹配a到z任意一个小写字母,A到Z则是大写
[0-9]                  #匹配0到9任意一个数字

# +    前面的字符或子模式匹配至少一次或多次
f+tx                   #匹配ftx、fffftx等更多的t加上tx
(ab)+                  #至少匹配一次或更多ab,例如ab、ababab等

#{}    {}内的值是非负整数,设置前面的字符或子模式匹配次数
#{n}        {n,m}其中n<m        {n,}最少出现n次,次数无上限    
ft{3}x                 #匹配ftttx
ft{3,6}x               #f和x之间3到6个t的字符都可以匹配
ft{3,}x                #f和x之间最少3个t或更多t的字符都可以匹配

# ()    正则表达式的子模式,会把括号内的表达式当做一个整体处理
(aft{1,2}x)?ef        #这里的?就是把括号内的表达式看做整体处理

# |     或者的意思
(abc|123)ef           #可以匹配abcef和123ef

grep

 准备一个文本文件进行操作演示

he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words

#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.

#grep会输出匹配到的字符串所在的行,仅仅是搜索,无法修改

#语法:        grep [选项]  [匹配模式] [搜索的文件]
#这里的文件可以是多个,也可以是目录

#选项

# -i        搜索时忽略大小写
grep -i "^the"  test.txt    #搜索以the开头的行,忽略大小写
# -v        搜索不匹配的行
grep -i -v "^the"  test.txt     #输出的是不匹配的行
# -c        输出匹配行数
grep -c "^the"  test.txt        #输出以the开头的行数

# -E        使用扩展正则表达式,在基本正则表达式中{}和+等符号没有特殊含义
#如果要使用这些符号的特殊含义则需要使用\转义符进行转义,或者使用-E则不需转义
grep "po\{2\}k" test.txt        #搜索包含pook的行,{}要进行转义
grep -E "po{2}l" test.txt       #使用-E之后就不用转义

# -n        显示搜索到的行的行号
grep -n "w.s" test.txt       #搜索w和s之间包含任意字符的字符串所在的行并显示行号

# -o        只输出匹配到的部分,而不是整行
grep -o -n "a[cv]e" test.txt       #搜索ace和ave并显示所在行行号

# -e        以多个模式进行搜索
grep -e "ace" -e "ave"  test.txt    #搜索ace和ave

# -q        不会把搜索到的信息显示出来
grep -q -E "s\.?$" test.txt         #搜索以s或s.结尾的行,可以把-q去掉查看搜索结果

# -w        匹配整个单词
grep -w "short" test.txt               #匹配单词short
grep -w "shor" test.txt                #少了个t就无法匹配short
grep "shor" test.txt                   #可以匹配到shor
    

sed

        sed可以在无交互的情况下对文本进行复杂的处理操作

        sed也被称为流编辑器,工作时逐行从输入流读取内容并存储在临时的缓冲区(也被称为模式空间),在模式空间中有顺序执行所有的sed命令,然后发送修改过的内容到输出流进行显示,最后清空模式空间,因此原文件并不会发生变化



#语法        sed [选项]  [操作]  目标文件
#sed常用的选项
#-n         仅显示处理过的内容
#-i         直接编辑原文件。sed默认修改模式空间的内容,-i表示修改原文件
#-f         从文件内读取sed命令操作目标文件
#-e         可以执行多个命令,只有一个命令时可以省略 

#常用操作
#这里仍然使用上面的测试文件
# d        删除指定行
sed "3,5d" test.txt           #删除3到5行的内容
sed '/the/d' test.txt         #删除the所在的行

# w        将指定模式空间的内容写入指定文件
sed "3,5w f.txt" test.txt     #将3到5行的内容写入到f.txt文件
# y        字符转换
sed "1y/was/ftx/" test.txt    #将第一行的was替换为ftx,注意替换前后字符串长度要相等
                              #不指定行数则代表替换全局was
# r        读取文件追加到模式空间指定位置
sed "9r f.txt" test.txt       #读取f.txt的内容追加到第9行后面,
                              #不指定行数则代表在每一行后面追加
# i        在当前行的上一行插入字符串
# a        在当前行的下一行插入字符串
sed "1i\ftx" test.txt         #在第一行前面插入ftx,不指定行则在每一行前插入
sed "1a\ftx" test.txt         #在第一行后面插入ftx,不指定行则在每一行后插入
#结合正则表达式
sed "/the/i ftx" test.txt     #在含有the的行前面插入ftx,a操作同理

# p        打印指定行
sed -n "3,5p" test.txt        #打印3到5行的内容,不指定行则输出所有
# =        打印当前处理的行号
sed "/he/=" test.txt          #这里结合正则表达式,输出he所在行的行号
# c        替换整行
sed "2c\ftx" test.txt         #将第2行内容替换为ftx,不指定行则替换每一行

#s         文本替换
sed "3s/o/x/" test.txt        #将第3行的第一个o替换为x,不指定行则代表所有行
sed "3s/o/x/g" test.txt       #加上g则代表替换整行的o
sed "3s/o/x/3" test.txt       #加上一个数字则代表替换指定行的第3个o
sed  -n "3s/o/x/p" test.txt    #使用-n和p则可以实现只打印替换的行
sed "3s/o/x/gw f.txt" test.txt    #替换整行后将替换后的行写入到f.txt
#也可以结合正则表达式使用,
sed "/w.s/d" test.txt        #删除匹配w和s之间任意一个字符的字符串所在的行

#这里有个问题,sed使用双引号时,可以引用一些变量,这时在某些时候会达不到我们
#想要的结果
sed "/!$/d" test.txt         #删除以!结尾的行
#例如这里的!$在Shell中代表上一条命令的最后一个参数,例如
echo ftx
sed "/!$/d" test.txt        #这时命令会被解析为sed "/ftx/d" test.txt
#所以在使用正则表达式时使用单引号,就不会解析变量
sed  '/!$/d'  test.txt

awk

        sed常用于一整行的处理,那么awk则是倾向于把一行内容分为多个字段进行处理,默认分隔符为空格或制表符

#awk常用的内置变量
# NR    当前处理的行号
# NF    行中的字段数
# $0    当前处理行的所有内容
# $n    当前处理行的第n个字段
# FS    定义输入字段分隔符
# OFS   定义输出字段分隔符

# -F    指定输出内容分隔符
# -v    设置awk内部变量

awk '{print NR $0}' test.txt            #打印行号和内容
awk 'NR==1 {print NR $0}' test.txt        #打印第1行内容,打印整行内容$0可以省略


#例如
awk 'NR==1 {print $)}' test.txt        #打印第一行的内容
#内容为 he was short and fat.
awk 'NR==1 {print NR $2}' test.txt       #打印第1行的第2个字段,使用空格分开
#输出:was

#输出第1行第2和3个字段,默认分隔符为空格,输出时把空格替换为a
awk  -v OFS='a' 'NR==1 {print NR $2,$3}' test.txt

#-F与OFS的区别则是-F直接把当前行内容以指定的字符分割,输出分隔符仍然是空格
awk -F 'a' 'NR==1 {print $2,$3}' test.txt

#结合正则表达式
awk '/the/ {print $2,$4}' test.txt         #打印含有the的行的第2和第4个字段

#这里也可以结合命令使用awk
df -Th | awk '/root/ {print $2,$4}'        #输出含有root行的第2和第4个参数
  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值