第4章 文本处理三剑客

第4章 文本处理三剑客

4.1、grep文本过工具

4.1.1、命令详解

【功能说明】

  grep命令是Linux系统中最重要的命令之一,其功能是从文本文件或管道数据流中帅选匹配的行及数据,如果配合正则表达式的一起使用,则功能更加强大。

【选择说明】

参数选项 解释说明
-v 显示不匹配的行,或者说排除某些行,显示不包括匹配文本的所有行
-n 显示匹配及行号
-i 不区分大小写(只适用于单字符),默认是区分大小写的
-c 只统计匹配的行数,注意不是匹配的次数
-E 使用扩展的egrep命令
--color=auto 为grep过滤的匹配字符串添加颜色
-w 只匹配过滤的单词
-o 只输出匹配的内容

4.1.2、使用范例

1、基础范例

范例4-1、请使用grep过滤不包含oldboy字符串的行(-v参数实践)

[root@db136 tmp]#cat test1.txt 
test
liyao
oldboy
[root@db136 tmp]#grep -v "oldboy" test1.txt 
test
liyao
[root@db136 tmp]#

范例4-2、使用grep命令显示过滤后的内容的行号(-n参数实战)

[root@db136 tmp]#cat test2.txt 
lisir
oldboy
oldboy linux
ALEX
[root@db136 tmp]#grep -n "oldboy" test2.txt 
2:oldboy
3:oldboy linux
[root@db136 tmp]#

范例4-3、-i不分区大小写参数实战

[root@db136 tmp]#grep 'alex' test2.txt 
[root@db136 tmp]#grep -i 'alex' test2.txt 
ALEX
[root@db136 tmp]#

范例4-4、同时过滤两个不同的字符串并为过滤的内容显示颜色(-E和--color的参数实践)

[root@db136 tmp]#grep -iE "oldboy|alex" test2.txt 
oldboy
oldboy linux
ALEX
[root@db136 tmp]#grep -iE "oldboy|alex" --color=auto  test2.txt 
oldboy
oldboy linux
ALEX
[root@db136 tmp]#

范例4-5、计算匹配的字符串的数量(-c)

[root@db136 tmp]#cat test2.txt 
lisir
oldboy
oldboy linux
ALEX
[root@db136 tmp]#grep -c "oldboy" test2.txt 
2
[root@db136 tmp]#

范例4-6、只输出匹配的内容(-o)

[root@db136 tmp]#cat test2.txt 
lisir
oldboy
oldboy linux
ALEX
[root@db136 tmp]#grep -o "oldboy" test2.txt 
oldboy
oldboy
[root@db136 tmp]#

范例4-7、grep搜索符合要求的用户(-w参数实践)

准备测试数据

[root@db136 tmp]#useradd oldboy
[root@db136 tmp]#useradd oldboy1
[root@db136 tmp]#useradd oldboy2
[root@db136 tmp]#useradd oldboy3
[root@db136 tmp]#grep -w oldboy /etc/passwd
oldboy:x:1003:1003::/home/oldboy:/bin/bash
[root@db136 tmp]#grep oldboy /etc/passwd   
oldboy:x:1003:1003::/home/oldboy:/bin/bash
oldboy1:x:1004:1004::/home/oldboy1:/bin/bash
oldboy2:x:1005:1005::/home/oldboy2:/bin/bash
oldboy3:x:1006:1006::/home/oldboy3:/bin/bash
[root@db136 tmp]#

2、生产案例

范例4-8、去除配置文件里面的注释和空行(正则表达式)

[root@db136 tmp]#cat /etc/rc.local 
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
sleep 300
systemctl stop iptables
echo 'PS1="\[\e[1;31m\][\u@\h \W]\\$\[\e[0m\]"' >/etc/profile.d/env.sh
[root@db136 tmp]#grep -Ev '^$|#' /etc/rc.local 
touch /var/lock/subsys/local
sleep 300
systemctl stop iptables
echo 'PS1="\[\e[1;31m\][\u@\h \W]\\$\[\e[0m\]"' >/etc/profile.d/env.sh
[root@db136 tmp]#

  "|"表示或,"^$"表示空行,"#"是注释符,"^$|#"匹配空行或包含注释符的行。

4.2、sed:字符流编辑器

4.2.1、命令详解

【功能说明】

  sed是操作、过滤和转换文本内容的强大工具。常用功能包括对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤指定字符串、取出指定行)。

【语法格式】

sed 【选项】【sed内置命令字符】【输入文件】

【选项说明】

参数选项 解释说明
-n 取消默认的sed输出,常与sed内置命令的p连用
-i 直接修改文件内容,而不是输出到终端。如果不使用-i选项,则sed只是修改内存中的数据,并不会影响磁盘上的文件

  sed的内置命令字符用于实现对文本文件不同的操作功能,例如对文件的增删改查等。

表4-3、sed常用内置命令字符的功能说明

sed内置命令字符 解释说明
a 全拼append,表示追加文本,在指定行后添加一行或多行文本
d 全拼delete,表示匹配行的文本
i 全拼insert,表示插入文本,在指定行前添加一行或多行文本
p 全拼print,表示打印匹配行的内容,通常p会与选项-n一起使用
s/regexp/replacement

匹配regexp部分的内容,用replacement替换regexp匹配的内容,regexp部分可以使用

正则表达式,在replacement部分可以使用特殊字符&和\1-\9等匹配regexp部分的部分内容。

在实战场景中,s/regexp/replacement/g结尾常与g匹配做全局替换

4.2.2、使用范例

1、基础范例

范例4-10、在指定行后追加文本

[root@db136 tmp]#cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#sed '2a 106,dandan,CSO' person.txt 
101,oldboy,CEO
102,zhangyao,CTO
106,dandan,CSO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#

  接下来我们解读一下该sed命令语句的结构,sed开头,然后接上空格,这里要郑重地和大家说一点,在练习Linux命令时,一定不要忘记空格(空格个数不限,但至少要有一个!),Linux命令和各个参数之间都需要以空格作为分隔符,否则命令会无法执行。

  在空格后面,我们先输入一对单引号(''),然后再退一格在单引号中输入sed的内置命令字符,先把2个引号输入完了,再在里面填写内容,这也是一个良好的习惯,因为很多人在输入内容的时候,把后面的引号忘了,最后命令执行失败还不知道哪里错了,因此我们要养成良好习惯,以避免没有意义的错误。

  接下来所讲的是重点了。sed后面单引号中的内容为:2a 106,dandan,CSO

  • 2表示对第2行进行操作,其他的行忽略。
  • a表示追加,2a表示在第2行后追加文本。
  • 2a后跟空格,然后接着输入想要追加的文本内容(106,dandan,CSO)即可。

范例4-11、在文件制定的行前插入文本

[root@db136 tmp]#cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#sed '2i 106,dandan,CSO' person.txt 
101,oldboy,CEO
106,dandan,CSO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#cat person.txt                     
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#

  接下来我们解读一下该sed命令语句的结构,以sed开头,然后接上空格,在空格后面是一对单引号,然后在单引号里面的内容是“2i 106,dandan,CSO”。

  • 2表示第2行进行操作,其他的行可忽略。
  • i代表插入的意思,2i表示在第2行即当前行插入文本,即插入到第3行。
  • 2i后面跟空格,然后跟上要插入的文本(106,dandan,CSO),最后接上要处理的文件person.txt

范例4-12、在文件指定行后追加多行文本

[root@db136 tmp]#cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#sed '2a 106,dandan,CSO\n107,bingbing,CCO' person.txt 
101,oldboy,CEO
102,zhangyao,CTO
106,dandan,CSO
107,bingbing,CCO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#

  然后我们来看一下结果,可以看到第2行"102,zhanyao,CTO"后面追加了2行文本"106,dandan,CSO"和"107,bingbing,CCO"。

  接下来我们解读一下sed语句的结构,sed软件大头,然后接上空格,在空格后面,我们先输入一对单引号(''),然后退一格在引号里面输入"2a 106,dandan,CSO\n107,bingbing,CCO"。

  • 2代表指定对第2行进行操作,其他的行忽略。
  • a代表追加的意思,2a即在第2行后追加文本。
  • 2a后面加上空格,然后输入想要插入的多行文本即可。这里的每行文本都是使用"\n"连接就可以写成一行了。
  • 最后输入想要处理的文件person.txt。

同理,在文件指定行前插入多行文本只需要将本例的sed内置命令a换成i就可以了。

范例4-13、删除文件中一行指定的文本。

[root@db136 tmp]#cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#sed '2d' person.txt 
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#

范例4-14、删除文件中指定的多行文本

[root@db136 tmp]#cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#sed '2,5d' person.txt 
101,oldboy,CEO
[root@db136 tmp]#cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#

范例4-15、使用sed命令替换文本内容

[root@db136 tmp]#cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#sed 's#zhangyao#dandan#g' person.txt 
101,oldboy,CEO
102,dandan,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#sed 's/zhangyao/dandan/g' person.txt    
101,oldboy,CEO
102,dandan,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#cat person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#

范例4-16、打印输出文件的指定行的内容

[root@db136 tmp]#sed '2,4p' person.txt 
101,oldboy,CEO
102,zhangyao,CTO
102,zhangyao,CTO
103,Alex,COO
103,Alex,COO
104,yy,CFO
104,yy,CFO
105,feixue,CIO
[root@db136 tmp]#sed -n '2,4p' person.txt 
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
[root@db136 tmp]#

2、生产案例

范例4-17、优化SSH配置(在SSH服务的配置文件中增加多行参数)

[root@db136 tmp]#cat -n sshd_config |head -20
     1  #       $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
     2
     3  # This is the sshd server system-wide configuration file.  See
     4  # sshd_config(5) for more information.
     5
     6  # This sshd was compiled with PATH=/usr/local/bin:/usr/bin
     7
     8  # The strategy used for options in the default sshd_config shipped with
     9  # OpenSSH is to specify options with their default value where
    10  # possible, but leave them commented.  Uncommented options override the
    11  # default value.
    12
    13  # If you want to change the port on a SELinux system, you have to tell
    14  # SELinux about this change.
    15  # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
    16  #
    17  #Port 22
    18  #AddressFamily any
    19  #ListenAddress 0.0.0.0
    20  #ListenAddress ::
[root@db136 tmp]#sed -i '13i Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' sshd_config   
[root@db136 tmp]#cat -n sshd_config |head -20
     1  #       $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
     2
     3  # This is the sshd server system-wide configuration file.  See
     4  # sshd_config(5) for more information.
     5
     6  # This sshd was compiled with PATH=/usr/local/bin:/usr/bin
     7
     8  # The strategy used for options in the default sshd_config shipped with
     9  # OpenSSH is to specify options with their default value where
    10  # possible, but leave them commented.  Uncommented options override the
    11  # default value.
    12
    13  Port 52113
    14  PermitRootLogin no
    15  PermitEmptyPasswords no
    16  UseDNS no
    17  GSSAPIAuthentication no
    18  # If you want to change the port on a SELinux system, you have to tell
    19  # SELinux about this change.
    20  # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
[root@db136 tmp]#
[root@db136 tmp]#sed -n '13,17p' sshd_config 
Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no
[root@db136 tmp]#

4.3、awk基础入门

4.3.1、命令详解

【功能说明】

  awk不仅仅是Linux系统中的一个命令,而且其还是一种编程语言,可以用来处理数据和生成报告(Execl)。处理的数据可以是一个或多个文件,它是Linux系统中最强大的文本处理工具之,没有之一。

表4-4、awk命令的常用功能

序号 awk命令的常用功能 简要例子说明
1 指定分隔符显示某几列 awk -F "GET|HTTP" '{print $2}' access.log直接取出显示日志文件的url这一列
2 通过正则表达式取出你想要的内容 awk '$6~/Faild/ {print $1}' /var/log/secure 分析生产环境中的日志找出谁在破解用户的密码
3 显示出某个范围内的内容 awk 'NR==20,NR==30' filename显示文件的20到30行
4 通过awk进行统计计算 awk '{sum+=$0} END {print $sum}' ett.txt计算总和
5 awk数组计算与去重 awk '{array[$1]++} END {for (key in array) print key,array[key]}' access.log 对日志进行统计与计数

-F:指定分隔符

4.3.2、使用范例

1、基础范例

测试文件及内容如下:

范例4-19、显示文件中的第5行

[root@db136 tmp]#cat -n passwd 
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  operator:x:11:0:operator:/root:/sbin/nologin
    11  games:x:12:100:games:/usr/games:/sbin/nologin
[root@db136 tmp]#awk 'NR==5' passwd    
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@db136 tmp]#

显示一部分的行的内容,例如显示2-6行

[root@db136 tmp]#cat -n passwd             
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  operator:x:11:0:operator:/root:/sbin/nologin
    11  games:x:12:100:games:/usr/games:/sbin/nologin
[root@db136 tmp]#awk 'NR==5, NR==8' passwd 
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
[root@db136 tmp]#

范例4-20、用awk实现给文件每行的内容之前加上行号

[root@db136 tmp]#awk '{print NR,$0}' passwd     
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
[root@db136 tmp]#awk '{print NR":",$0}' passwd 
1: root:x:0:0:root:/root:/bin/bash
2: bin:x:1:1:bin:/bin:/sbin/nologin
3: daemon:x:2:2:daemon:/sbin:/sbin/nologin
4: adm:x:3:4:adm:/var/adm:/sbin/nologin
5: lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6: sync:x:5:0:sync:/sbin:/bin/sync
7: shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8: halt:x:7:0:halt:/sbin:/sbin/halt
9: mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10: operator:x:11:0:operator:/root:/sbin/nologin
11: games:x:12:100:games:/usr/games:/sbin/nologin
[root@db136 tmp]#

  这里的NR还是表示航海,$0表示一整行的内容(一行的内容)。print关键字表示显示的内容,相当于是awk内部的一个命令。那么print命令为何要放在花括号中呢?因为这个命令(动作)是"很害羞"的,需要"城墙"包括(花括号)。

[root@db136 tmp]#cat -n passwd 
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  operator:x:11:0:operator:/root:/sbin/nologin
    11  games:x:12:100:games:/usr/games:/sbin/nologin
[root@db136 tmp]#awk 'NR==2,NR==6 {print NR,$0}' passwd 
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
[root@db136 tmp]#

范例4-21、打印IP

[root@db136 tmp]#ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.142.136  netmask 255.255.255.0  broadcast 192.168.142.255
        inet6 fe80::2e32:1cff:bc3:cbb3  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:3e:ec:75  txqueuelen 1000  (Ethernet)
        RX packets 6185  bytes 657110 (641.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4057  bytes 689478 (673.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@db136 tmp]#ifconfig |awk 'NR==2 {print $2}' 
192.168.142.136
[root@db136 tmp]#

范例4-22、显示文件的第一列,第三列和最后一列

[root@db136 tmp]#awk -F":" '{print $1,$3,$NF}' passwd         
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
sync 5 /bin/sync
shutdown 6 /sbin/shutdown
halt 7 /sbin/halt
mail 8 /sbin/nologin
operator 11 /sbin/nologin
games 12 /sbin/nologin
[root@db136 tmp]#awk -F":" '{print $1,"#",$3,"#",$NF}' passwd 
root # 0 # /bin/bash
bin # 1 # /sbin/nologin
daemon # 2 # /sbin/nologin
adm # 3 # /sbin/nologin
lp # 4 # /sbin/nologin
sync # 5 # /bin/sync
shutdown # 6 # /sbin/shutdown
halt # 7 # /sbin/halt
mail # 8 # /sbin/nologin
operator # 11 # /sbin/nologin
games # 12 # /sbin/nologin
[root@db136 tmp]#

  这里我们使用了awk的-F参数,注意一定要是大写的,-F参数表示指定一把"菜刀"(分隔符)来切割每一行的内容,-F后面可用单引号或不加引号,但是,建议加引号。

这里,我们指定的"菜刀"是冒号":",这样改行就被不同的冒号切割成了很多部分。切成了很多部分之后,若我们要使用某一部分该怎么办?使用"$"(美元符号)后面接数字,$1表示第一列,$2表示第二列,依次类推。但$0表是正行。这里有个特殊的表示最后一列的方法,就通过$NF来表示最后一列。

范例4-23、把文件中的/bin/nologin替换为/bin/bash(awk函数功能实践)

[root@db136 tmp]#awk '{gsub("/sbin/nologin", "/bin/bash", $0); print $0}' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
adm:x:3:4:adm:/var/adm:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/bin/bash
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:/bin/bash
operator:x:11:0:operator:/root:/bin/bash
games:x:12:100:games:/usr/games:/bin/bash
[root@db136 tmp]#

这里使用的是awk里面的查找替换功能,即gsub函数。

gsub("替换对象", "替换成什么", 哪一列)
注意:
1、gsub与后面的括号之间不能有空格。
2、替换对象、替换成什么以及那一列之间要用逗号隔开。
3、替换对象的外面要有双引号或双斜线包裹起来,即"替换对象"或/替换对象/。
4、替换成什么内容就只能用双引号包裹起来了,即"替换成什么"。
5、最后一个是哪一列,这个是可以省略的,省略的时候表示要替换整行的内容,相当于是写上了$0。

2、生产案例

范例4-24、取出eth0网卡对应的IP地址。

[root@db132 tmp]#ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:0C:29:39:D7:F6  
          inet addr:192.168.142.132  Bcast:192.168.142.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe39:d7f6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1017 errors:0 dropped:0 overruns:0 frame:0
          TX packets:821 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:103780 (101.3 KiB)  TX bytes:93429 (91.2 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:122 errors:0 dropped:0 overruns:0 frame:0
          TX packets:122 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:6710 (6.5 KiB)  TX bytes:6710 (6.5 KiB)

[root@db132 tmp]#ifconfig eth0| awk -F "[ :]+" 'NR==2 {print $4}'
192.168.142.132
[root@db132 tmp]#

范例4-25、企业面试题-统计域名访问次数

[root@db132 tmp]#cat x.log 
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
[root@db132 tmp]#awk -F"/" '{print $3}' x.log
www.etiantian.org
www.etiantian.org
post.etiantian.org
mp3.etiantian.org
www.etiantian.org
post.etiantian.org
[root@db132 tmp]#

[root@db132 tmp]#awk -F"/" '{print $3}' x.log | sort -r
www.etiantian.org
www.etiantian.org
www.etiantian.org
post.etiantian.org
post.etiantian.org
mp3.etiantian.org
[root@db132 tmp]#awk -F"/" '{print $3}' x.log | sort -r| uniq -c
3 www.etiantian.org
2 post.etiantian.org
1 mp3.etiantian.org
[root@db132 tmp]#

 

 

 


posted @ 2020-01-16 16:14  davie2020  阅读(104)  评论(0编辑  收藏  举报