第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表示第一列,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]#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下