设为首页 加入收藏

TOP

Linux:管道命令与文本处理三剑客(grep、sed、awk)(二)
2023-07-23 13:34:05 】 浏览:82
Tags:Linux 管道命 文本处 grep sed awk
行操作的行数,比如我的操作需要在10到20行之间进行,则写为10, 20[操作名称]

具体地,对行的操作函数function包括下面这些东西:

  • a:新增,a的后面可以接字符,这些字符将被添加在n1/n2下一行
  • c:替换,c的后面可以接字符,这些字符可以替换n1n2之间的行;
  • d:删除,因为是删除,所以d后面通常不需要接任何东西;
  • i:插入,i的后面可以接字符,这些字符将被添加在n1/n2上一行
  • p:打印,亦即将某些选择的行打印出来。通常p会与参数sed -n一起运行。
  • s:替换,可以直接进行替换的工作,通常这个s的操作可以搭配正则表达式。

下面我们来举几个例子进行说明。

以行为单位的新增/删除功能

范例一:查看/etc/passwd文件的内容并且在每一行前面加上行号,同时将2-5行删除。

root@orion-orion:~ cat -n /etc/passwd | sed '2,5d'
    1  root:x:0:0:root:/root:/bin/zsh
    6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
    7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
    8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
    ...

可以看到sed的操作为2,5d,也即删除2~5行,所以显示的数据就没有2~5行。此外,请注意原本应该是要执行sed -e才对,不过这里没有-e也行,因为已经默认选了。同时也要注意sed后面接的操作务必以两个单引号''括住。

我们将范例变一下,如果要删除第2行,那么可以使用cat -n /etc/passwd | sed '2d' ;如果是要删除第3到最后一行,则是cat -n /etc/passwd | sed '3,$d',这里美元符号$代表最后一行。

范例二: 承接上题,在第2行后(亦即是第3行)加上drink tea字样。

root@orion-orion:~ cat -n /etc/passwd | sed '2a Drink tea?'
     1  root:x:0:0:root:/root:/bin/zsh
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
Drink tea?
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     ...

如果想要加在第2行前面,将新增操作改为插入操作,即cat -n /etc/passwd | sed '2i Drink tea?'就行了。

范例三:继续承接上题,现在我们想要在第2行后面加上两行字,例如Drink tea or...Drink beer?

root@orion-orion:~ cat -n /etc/passwd | sed '2a Drink tea or...\                                                  
\ Drink beer?'
     1  root:x:0:0:root:/root:/bin/zsh
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
Drink tea or...
Drink beer?
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin

这里的重点在于我们可以不只增加一行,可以增加很多行,但每一行之间必须以反斜杠\来进行新行的增加。

以行为单位的替换与显示功能

刚刚是介绍如何新增与删除行。接下来我们看看如何进行整行的替换。

范例四:我想将2~5行的内容替换为No 2-5 number

root@orion-orion:~ cat -n /etc/passwd | sed '2,5c No 2-5 number`   
     1  root:x:0:0:root:/root:/bin/zsh
No 2-5 number
     6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
     ...

除此之外,sed还有很有趣的功能,以前我们想要列出第11~25行,得用head -n 20tail -n 10之类的命令来处理,很麻烦。而sed则可以直接取出你想要的那几行,这是通过行号来识别的。例如下面这个范例:

范例五:仅列出/etc/passwd文件内的第5-7行。

root@orion-orion:~ cat -n /etc/passwd | sed -n '5,7p'
     5  sync:x:4:65534:sync:/bin:/bin/sync
     6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin

注意,这里必须要加-n表示安静模式。如果不加-n改为sed 5,7p,那么第5-7行会重复输出:

root@orion-orion:~ cat -n /etc/passwd | sed '5,7p'
     1  root:x:0:0:root:/root:/bin/zsh
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
     5  sync:x:4:65534:sync:/bin:/bin/sync
     5  sync:x:4:65534:sync:/bin:/bin/sync
     6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
     6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     ...

部分数据的查找并替换的功能

除了整行的处理模式之外,sed还可以对某行进行部分数据的查找和替换。基本上sed的查找与替换与vi相当的类似,它的格式如下所示:

sed 's/要被替换的字符/新的字符/g'

接下来我们来看一个取得IP数据的范例,我们将该任务拆解为多步,一段一段地处理。

步骤一:先观察原始信息,利用/sbin/ifconfig查询IP是什么?

root@orion-orion:~ /sbin/ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:0c  
          inet addr:172.17.0.12  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:49498631 errors:0 dropped:0 overruns:0 frame:0
          TX packets:41131666 errors:0 dropped:0 overruns:0 carrier:0
          collisions:
首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇CentOS7---部署Tomcat和安装Jpress 下一篇linux vi命令详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目