设为首页 加入收藏

TOP

Linux:管道命令与文本处理三剑客(grep、sed、awk)(三)
2023-07-23 13:34:05 】 浏览:79
Tags:Linux 管道命 文本处 grep sed awk
0 txqueuelen:0 RX bytes:51467728818 (51.4 GB) TX bytes:40995045195 (40.9 GB)

我们希望用关键词识别出172.17.0.12,这是我所用学校服务器的内网私有IP地址。

步骤二:利用关键字配合grep选取出inet所在的那关键的一行。

root@orion-orion:~ /sbin/ifconfig eth0 | grep 'inet '
          inet addr:172.17.0.12  Bcast:172.17.255.255  Mask:255.255.0.0

好了,现在只剩下一行了,但我们想只留下IP地址addr:172.17.0.12而将其它部分统统删除。

步骤三:先将IP前面的部分予以删除(用到正则表达式)。

root@orion-orion:~ /sbin/ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g'
addr:172.17.0.12  Bcast:172.17.255.255  Mask:255.255.0.0

这里正则表达式中的^表示待查找的字符串在行首;.表示一定有一个任意字符,*表示重复前一个字符0到无穷多次,连在一起的.*就表示任意字符重复任意次;//之间为空,也就表示删除的意思。

步骤四:将IP后面的部分也予以删除。

root@orion-orion:~ /sbin/ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g' \
\ | sed 's/ *Bcast.*$//g' 
addr:172.17.0.12

这里' *'表示空格重复任意次;.*表示任意字符重复任意次;$表示待查找的字符串在行尾。

我们再来继续研究sed与正则表达式的配合练习。假设我们只要/etc/adduser.conf 文件中UID存在的那几行数据,但是有#在内的注释我们不要,而且空白行我们也不要,那么应该如何处理?可以通过这几个步骤来实践看看:

步骤一:先用grep将关键字UID所在行取出来。

root@orion-orion:~ cat /etc/adduser.conf  | grep 'UID'
# FIRST_SYSTEM_[GU]ID to LAST_SYSTEM_[GU]ID inclusive is the range for UIDs
# package, may assume that UIDs less than 100 are unallocated.
FIRST_SYSTEM_UID=100
LAST_SYSTEM_UID=999
# FIRST_[GU]ID to LAST_[GU]ID inclusive is the range of UIDs of dynamically
FIRST_UID=1000
LAST_UID=29999

步骤二:删除掉注释之后的内容:

root@orion-orion:~ cat /etc/adduser.conf | grep 'UID' | sed 's/#.*$//g' 


FIRST_SYSTEM_UID=100
LAST_SYSTEM_UID=999

FIRST_UID=1000
LAST_UID=29999

这样原本注释的内容都变成了空白行,接下来我们删除空白行:

root@orion-orion:~ cat /etc/adduser.conf | grep 'UID' | sed 's/#.*$//g' | sed '/^$/d'
FIRST_SYSTEM_UID=100
LAST_SYSTEM_UID=999
FIRST_UID=1000
LAST_UID=29999

注意这里的^$表示行首^和行尾$之间没有字符,也即空白行。

直接修改文件内容(危险操作)

sed的能耐可不止于我们上面所说的,它甚至可以直接修改文件的内容,而不必使用管道命令或数据流重定向。不过这个操作会修改到原始的文件,所以请你千万不要随便拿系统配置文件来测试。我们下面使用regular_express.txt文件来测试(文件可以去鸟哥的官网下载:regular_express.txt)。

root@orion-orion:~ cat regular_express.txt                                                                     
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
...
go! go! Let's go.
# I am VBird

范例六:利用sedregular_express.txt内每一行结尾若为.则换成!

root@orion-orion:~ sed -i 's/\.$/\!/g' regular_express.txt
root@orion-orion:~ cat regular_express.txt
"Open Source" is a good mechanism to develop programs!
apple is my favorite food!
Football game is not use feet only!
this dress doesn't fit me!
...
go! go! Let's go!
# I am VBird

上面的-i选项可以让你的sed直接去修改后面所接的文件内容而不是由屏幕输出。

范例七:利用sed直接在regular_express.txt最后一行加入# This is a test

root@orion-orion:~ sed -i '$a # This is a test' regular_express.txt
root@orion-orion:~ tail regular_express.txt
...
go! go! Let's go!
# I am VBird

# This is a test

由于$代表的是最后一行,而a的操作是新增,因此是该文件最后新增。

sed-i选项可以直接修改文件内容,因此这功能非常有帮助。比如如果你有一个100万行的文件,你要在第100行加某些文字,此时使用vim可能会疯掉,因为文件太大了。此时就可以利用sed来直接修改与替换,而不需要使用vim去修改了。

4 字段操作命令awk

相较于sed常常对一整行进行操作,awk则倾向于将一行分为多个字段来处理。因此,awk相当适合处理小型的文本数据,其运行模式通常是这样的:

awk '{条件类型1{操作1} 条件类型2{操作2} ...}' filename

awk后接两个单引号并加上大括号{}来设置想要对数据进行的处理操作。awk可以处理后续接的文件,也可以读取来自前一个命令的标准输出。如前面所说,awk主要是将每一行分为多个字段来处理,而默认的字段分隔符为空格键[Tab]键。举例来说,我们用last将登陆者的数据取出来(仅取出前3行):

root@orion-orion:~ last -n 3
root     pts/292      10.249.45.37     Wed Mar 29 06:55 - 09:14  (02:19)
root     pts/292      10.249.45.37     Tue Mar 28 13:17 - 16:14  (02:56)
root     pts/292      10.249.45.37     Tue Mar 28 12
首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇CentOS7---部署Tomcat和安装Jpress 下一篇linux vi命令详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目