从cut、sed到Linux强大的文本分析工具awk

本文介绍了Sed命令的基本概念、语法及多种实用场景,包括行增删改查等操作,通过具体示例帮助读者掌握Sed命令的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Sed命令

1、sed基本介绍

1、介绍:
    行编辑器,默认不做原文件的修改。只是在其特有的模式空间内按行读取数据并编辑,
    操作完成后并打印在控制台。

2、语法:
    sed [options] [-e<script>] [-f<script文件>] [文本文件]
    
    options:
        -n 仅显示被处理的行    
        -e 后接脚本命令(一般可省略)
        -f 后接脚本文件,可以把-e后的脚本命令放入到脚本文件中
    
    script和script文件中可以存在的参数:
        a :新增,a后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
        i :插入,i后面可以接字串,而这些字串会在新的一行出现(目前的上一行)~
        d :删除,因为是删除啊,所以d后面通常不接任何咚咚;
        p :打印,亦即将某个选择的数据印出。通常p会与参数sed -n一起运行~
        c :取代,c后面可以接字串,这些字串可以取代 n1,n2 之间的行~
        s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!


    

2、sed的用法示例

注:
    sed前的-e可加可不加,在多点编辑的时候,每一个具体操作前都要加-e
    直接明确操作多少行时候,用\,操作包含xxx的行的时候,用/

1、指定行新增
    在a.sh后的第四行后增加一行,内容为“啦啦啦”
    sed '4a\啦啦啦' a.sh
    在a.sh后的第四行前增加两行,内容为“嘿嘿嘿”、“哈哈哈”
    sed '4i\嘿嘿嘿\哈哈哈' a.sh
       哈哈哈前要有换行符

2、指定行删除
    列出行号并删除a.sh的第4-5行
    nl a.sh | sed '4,5d'
            $代表最后一行

3、指定行替换
    将a.sh的1-2行替换成“no 2 row”
    sed  '2c\no 2 row' a.sh

4、指定行打印
    仅打印a.sh 第2-3行
    sed -n '2,3p' a.sh

5、特定行打印
    寻找a.sh中包含root的行,仅打印这些行,并显示行号
    nl a.sh | sed -n '/root/p'

6、特定行删除
    寻找a.sh中包含root的行并删除
    sed  '/root/d'

7、特定行替换
    寻找a.sh中的root替换成guest
    sed 's/root/guest/g' a.sh

8、
    

 

3、示例

数据

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysqladmin:x:514:101::/usr/local/mysql:/bin/bash

按:切割a.txt文件,打印第一列

awk -F':' '{print $1}' a.txt

按:切割a.txt文件,打印第一列和第七列,tab键分隔

awk -F':' '{print $1 "\t" $7}' a.txt

按:切割a.txt文件,打印第一列和第七列,表头追加name和shell,表尾追加over,字段间tab键分隔

awk -F':' 'BEGIN{print "name\tshell"} {print $1 "\t" $7} END{print "over"}' a.txt

打印含root单词的行

awk '/root/ {print $0} ' a.txt

打印含root单词的行后,再打印所有行(搜索值作用于第一个函数)

awk '/root/ {print $0}  {print $0} ' a.txt

打印文件每行的信息,最前方追加行号和该行总列数,用tab键分隔

awk -F':' '{print NR "\t" NF "\t" $0}' a.txt

报表统计:

数据

统计报表:合计每人1月工资,0:manager,1:worker
Tom	 0   2012-12-11      car     3000
John	 1   2013-01-13      bike    1000
vivi	 1   2013-01-18      car     2800
Tom	 0   2013-01-20      car     2500
John	 1   2013-01-28      bike    3500

统计01月员工工资

awk '{split($3,date,"-");if(date[2]=="01"){name[$1]+=$5}} END{for(i in name){print i "\t" name[i]}}' a.txt

统计01月员工工资,员工类型为0,末尾追加M,为1末尾追加W

awk '{split($3,date,"-");if(date[2]=="01"){name[$1]+=$5};if($2=="0"){role[$1]="M"}else{role[$1]="W"}} END{for(i in name){print i "\t" name[i] "\t" role[i]}}' a.txt

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二百四十九先森

你的打赏是我努力的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值