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
范例六:利用sed
将regular_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