Linux的sed、awk和正则表达式

Linux的文件内容处理命令

1、tar的命令

#tar的命令:只提供归档,不提供压缩算法
$ tar -cvf example.tar a.txt b.txt #将文件a.txt和b.txt归档
$ tar -tf example.tar              #查看归档文件
$ tar -xvf example.tar             #释放归档文件example.tar
$ tar -xvf example.tar -C /tmp     #释放到指定目录
-c 创建归档文件
-x 释放归档文件
-t 查看归档文件或压缩文件
-f 指定要归档、压缩或查看的文件的名称
-v 显示命令的执行过程
$ tar -cvzf example.tar.gz a b dir0/    #压缩a、b和dir0/到example.tar.gz中
$ tar -xzvf example.tar.gz              #解压gz包
$ tar -xzvf example.tar.gz -C /tmp      #解压到指定目录中
$ tar cjvf example.tar.bz2 a b dir0/    #压缩文件成example.tar.bz2
$ tar xjvf example.tar.bz2              #解压bz2文件
$ tar -xjvf example.tar.bz2 -C /tmp     #解压bz2到指定目录tmp
$ xz -d linux.tar.xz                    #解压.xz格式 可下载
#其他的压缩解压命令:gzip、gunzip、zip、unzip的命令
$ zip car218_e01p.zip ./*     #把当前目录下所有,压缩到xxx.zip中   结果%0是对的
$ unzip mypackage.zip -d /opt #解压mypackage.zip 到指定目录 -d 的/opt下
$ zip -p -r admin.zip *     #压缩当前目录下的所有,包括隐藏文件等(记住是-p,不是-q)

2、sort、uniq、wc的命令

$ uniq  file         #去掉文件内容的重复行
$ sort file | uniq   #先根据每行的首字母对照ASCII码进行排序,然后去掉重复行
$ wc file            #计算文件的三个属性行号、单词数以及字符数
$ wc file -w         #只查看文件的单词数
$ wc file1 file2     #wc查看多个文件的属性,行号、单词数和字符数

3、去掉多余空行

$ grep -v '^$' rumenz.txt   #去掉多余空行;^表示开头,$表示结尾
$ sed '/^$/d' rumenz.txt    #去掉多余空行;^$用于匹配空白行,d用于删除匹配项
$ awk '!/^$/' rumenz.txt   #去掉多余空行;^$用于匹配空白行,!用来取反。
$ cat rumenz.txt | tr -s '\n' #去掉多余空行;-s 用于将其输出中相邻字符序列压缩为单个字符
$ vim rumenz.txt:g/^$/d     #去掉多余空行,g指定全局搜索,^$用于匹配空白字符行,d表示删除匹配项。

4、awk的使用

$ awk 'NR==1 {print $0} NF==5 { print $1}' ifc.txt  #输出第一行的内容;接着如果一行有5个字段则输出第一个字段

$ awk '条件1 {动作1} 条件2 {动作2} ……' file  #awk讲解事例
#从file中每次读取一行,然后针对这一行判断条件1,成立则执行动作1,否则不执行;然后判断条件2,成立则执行动作2,否则不执行,以此类推。如果一个动作前面没有条件,则这个动作就可以“无条件”执行。 

$ awk ' {print $1,$5}' ifc.txt   #awk的花括号{awk语句}只能被单引号包含,没指明就所有行
# $1表示第1列,$2表示第2列,$n表示第n列,以此类推。$0表示整一行(即所有列)

$ awk '{printf "%-10s:%-2d\n",$1,$5}' ifc.txt  #格式化输出,即C语言的printf的用法
$ awk '$5==11 && $6>=90 {print $0}' ifc.txt     #如果第5个字段的条件和第6个字段的条件同时满足,则打印一整行,然后都下一行。
$ awk 'NR==1 || $6>=90 { print }' ifc.txt #打印表头NR表示行号,print等价于print$0一整行

在这里插入图片描述

$ awk 'BEGIN { FS=":"} {print $1}' ifc.txt  #BEGIN在awk执行之前的语句条件,即一般设置变量啥的,打印标题啥的;END的用法是awk扫描完之后做,一般计算求和啥的
awk ‘BEGIN{
    
    操作}  条件{
    
    print 语句}file   #BEGIN的例子
awk 'BEGIN{FS=":";print"----"} $1~"r..t"{print $1} END{print "--------"}' /etc/passwd #END的例子

$ awk -F: '{print $1}' ifc.txt     #-F的用法和FS的用法差不多
$ awk -F'[\t;:]' '{print $1}' ifc.txt   #-F’[\t;:]是指定制表符、分号号冒号作为分隔符号
$ awk '$0~/BLUE/ {print}' grade.txt # $0~/BLUE/是一个条件,表示所指定的域(要匹配的规则)
#打印含BLUE的一行内容

$ awk '$0!~/GREEN.*/ {print}' grade.txt    #将所有不匹配GREEN的行打印出来
$ awk '{print > $5}' grade.txt             #将没行重定向到第5个域命名的文件中去
$ awk '{print $1, $6 > $5}' grade.txt      #将将第一个域和第四个域的内容重定向到第5域名文件中
$ awk '{ if($4~/BLUE.*|BLACK/) print > "high.txt"; else if($4~/Yellow|[Gg]reen/) print > "midle.txt"; else print > "low.txt"}' grade.txt
#如果记录中的第4域($4)匹配BLUE.*|BLACK,就经该记录重定位到文件high.txt,如果匹配Yellow或者[Gg]reen,就重定位到midle.txt中,否则全部重定位到low.txt中。
$ awk '{sum+=$4;print $4} END{print sum}' grade.txt    #第4项求和
$ awk 'NR!=1 {a[$4]++;} END{for (i in a) print i","a[i];}' grade.txt  #计算各个级别的数量,84分的有2个,72的有三个等 a数组可以换成d等,是随机取得
#编写awk脚本文件
#!/usr/bin/awk -f    运行方式-f需要输入文件

BEGIN{
    
        #awk开始运行之前的准备工作
    math=0
    english=0
}
{
    
    
    if(NR==1)   #打印表头
    {
    
    
        print $0
        printf "=============="    #printf不换行
        print "==============="    #打印带换行
    }
    else
    {
    
    
        math+=$4
        english+=$5
        print $0    #打印整行
    }
}
END{
    
       #awk运行之后,end才开始工作
    printf "====================="
    print "======================"
    print "Average:\t math=" math/NR "\tenglish=" english/NR   #支持除法
}

$ awk -f kk.awk grade.txt  #运行脚本文件的方式

5、正则表达式的特殊字符

在这里插入图片描述

$ grep 'apple' example.txt -n  #打印‘apple’改行的内容,并红色apple的单词其中的-n是提示行号
$ grep '[^ ]*ing' example.txt -nE 
# [^ ]表示一个不为空格的任意字符,*表示前面的模式(及一个不为空格的任意字符)被重复0次或多次,ing精准匹配ing;
#总的来说找出不以空格开头且以ing结尾的单词 -nE表示的E是支持扩展正则表达式
# egrep = grep -E
$ grep '\<is\>' example.txt -nE       #精准匹配is单词
$ grep '^\$.{2}$' example.txt -nE     #匹配行首是$,并且一个字母出现两次的结尾单词,若$前不加\的话就表示的是行尾,而不是$这个字符了

6、sed的命令(流式编译器的简写)

$ sed "s/-year/years/" people.txt  #将-year替换成years  文件内容并没有改,只是结果改变了  往往需要重定向文件
$ sed "2s/-year/years/" people.txt  #指定行替换,只将第2行的-year替换成years
$ sed "2,5s/-year/years/" people.txt #将第2~5行的-year改成years
$ sed -i "2s/-year/years/" people.txt # -i在原文中修改内容
$ sed "s/s/S/g" people.txt            #将全文中的s改成S
$ sed "s/s/S/2" people.txt            #每行中第2个s改成大S 
$ sed "s/s/S/2g" people.txt           #每行中第2个s以后的s改成大S
$ sed 's/-year/years/; 3,$s/.$//' people.txt  #将-year改成years,;然后将第3行以后的最后一个任意字符去掉
$ sed -e 's/-year/years/' -e '3,$s/.$//' people.txt #和上面的等效,-e就是把每句话单独写
$ sed "s/is/[&]/" people.txt       #将第一个is左右两边加上[] ;[&] &替代被匹配的变量
$ sed 'N;s/is/IS/' people.txt      #通过N又多读了一行;最后结果是奇数行变大写
$ sed '3i x' people.txt            #第3行前插入x字符
$ sed '2a x' people.txt            #第2行后插入x字符
$ sed '1,4a x' people.txt          #第1~4行后插入x字符
$ sed '/US/a x' people.txt         #在陪陪US的行后插入x
$ sed "2c ok" people.txt           #将第2行转换成ok
$ sed '2d' people.txt              #将第2行给删除
$ sed '/US/d' people.txt           #将匹配/US/的所有行删掉
$ sed '/\<he\>/d' people.txt       #将匹配he的说有行给删除,<>需要转义字符
$ sed '/Chen/p' people.txt -n      #打印匹配Chen的行
$ sed '/Chen/, /Lau/p' people.txt -n #打印匹配Chen或Lau的行
$ sed '3, /UK/p' people.txt -n       #从第3行开始打印直到匹配UK为止
$ sed '/UK/,6p' people.txt -n    #从匹配UK打印到第6行
$ sed '/US/,+2p' people.txt -n   #打印匹配US的行,并打印其后的2行
$ sed '{/he/{/18/p}}' people.txt -n #多命令执行,匹配所有/he/的行之后,在匹配/18/的行,然后打印出来

猜你喜欢

转载自blog.csdn.net/weixin_44763594/article/details/125883003