sed基础题
1-5题编写1个num.txt,文件中每行写入1-10的数字。
可以使用seq 10 > num.txt生成。
1、sed G通常是在文件每一行下面输出一个空行,现在让你在文件的每一个非空行下面输出一个空行,如果要输出两个空行呢?
sed G num.txt
sed 'G;G' num.txt
2、在文件中匹配1的所有行下面输出一个空行
sed 1G num.txt
3、在文件的偶数行下面插入一个空行
sed 'n;G' num.txt
4、删除文件的偶数行
sed '2~2d' num.txt
5、删除文件末尾两行
sed '9,10d' num.txt
6、使用sed取出/etc/sysconfig/network-scripts/ifconfig-ens33网卡文件中的基名(basename命令结果)与目录名(dirname命令结果)
dirname命令结果:
dirname /etc/sysconfig/network-scripts/ifcfg-ens33
/etc/sysconfig/network-scripts
basename命令结果:
basename /etc/sysconfig/network-scripts/ifcfg-ens33
ifcfg-ens33
文件中的基名:echo /etc/sysconfig/network-scripts/ifcfg-ens33 | sed -nr ‘s#.*/(.+)/?#\1#p’
目录名:
`echo /etc/sysconfig/network-scripts/ifcfg-ens33 | sed -nr 's#(.*)/(.+)/?#\1#p'`
awk基础题
文件 file.txt的内容格式:
文件中包含名字,电话号码和过去三个月里的捐款
具体内容如下:
Mike Harrington:[510] 548-1278:250:100:175
Christian Dobbins:[408] 538-2358:155:90:201
Susan Dalsass:[206] 654-6279:250:60:50
Archie McNichol:[206] 548-1348:250:100:175
Jody Savage:[206] 548-1278:15:188:150
Guy Quigley:[916] 343-6410:250:100:175
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
John Goldenrod:[916] 348-4278:250:100:175
Chet Main:[510] 548-5258:50:95:135
Tom Savage:[408] 926-3456:250:168:200
Elizabeth Stachelin:[916] 440-1763:175:75:300
练习:
- 显示所有电话号码
- 显示Dan的电话号码
- 显示Susan的名字和电话号码
- 显示所有以D开头的姓
- 显示所有以一个C或E开头的名
- 显示所有只有四个字符的名
- 显示所有区号为916的人名
- 显示Mike的捐款.显示每个值时都有以$开头.如$250$100$175
- 显示姓,其后跟一个逗号和名,如Jody,Savage
10.写一个awk的脚本,它的作用:显示Savage的全名和电话号码.显示Chet的捐款.显示所有头一个月捐款$250的人名.
1
[root@localhost zhaoyj]# awk -F: '{print $2}' file.txt
2
[root@localhost zhaoyj]# awk -F: '$1~/Dan/{print $2}' file.txt
[406] 298-7744
3
[root@localhost zhaoyj]# awk -F: '$1~/Susan/{print$1":"$2}' file.txt
Susan Dalsass:[206] 654-6279
4
[root@localhost zhaoyj]# awk '$1~/^D/{print $1}' file.txt
Dan
5
[root@localhost zhaoyj]# awk -F: '$1~/^[C|E]/{print $1}' file.txt |awk '{print $2}'
Dobbins
Main
Stachelin
6
[root@localhost zhaoyj]# awk 'length($1)=="4"{print $1}' file.txt
Mike
Jody
John
Chet
7
[root@localhost zhaoyj]# awk -F"[ :]" '$3~/916/{print $1" "$2}' file.txt
Guy Quigley
John Goldenrod
Elizabeth Stachelin
8
[root@localhost zhaoyj]#
awk -F: 'BEGIN{OFS="$"}$1~/Mike/{print "",$3,$4,$5}' file.txt
awk -F: '$1~/Mike/{print "$"$3" ""$"$4" ""$"$5}' file.txt
$250 $100 $175
9
[root@localhost zhaoyj]# awk -F: '{print $1}' file.txt |awk '{print $1","$2}'
10
命令式:
awk -F: '/Savage/{print $1,$2} /Chet/{print $(NF-2),$(NF-1),$NF} $(NF-2)==250 {print $1}' file.txt
脚本式:
BEGIN{
FS=":";
}
{
if(/Savage/)
print $1,$2;
else if(/Chet/)
print $1,$(NF-2),$(NF-1),$NF;
else if($(NF-2)==250)
print $1,$(NF-2);
}
awk进阶版
1、统计/etc/fstab⽂件中每个⽂件系统类型出现的次数?
egrep -v '^(^$|#)' /etc/fstab |awk '{array[$3]++}END{for (i in array) {print i,array[i]}}'
2、统计/etc/fstab⽂件中每个单词出现的次数?
egrep -v '^(^$|#)' /etc/fstab |awk '{for (i=1;i<=NF;i++){array[$i]++}}END{for (i in array) {print i,array[i]}}'
或:
awk '/^[^# ]/{for(i=1;i<=NF;i++){array[$i]++}}END{for (i in array) {print i,array[i]}}' /etc/fstab
3、使⽤awk统计当前主机的并发访问量?
netstat -tan | awk 'NF>2{array[$6]++}END{for (i in array) print i,array[i]}'
或:
netstat -tan | awk '/^tcp/{array[$6]++}END{for (i in array) print i,array[i]}'
4、使⽤awk命令,计算⼀个⽬录下⽂件⼤⼩的总和?
ll |awk 'BEGIN{sum=0}{sum=sum+$5}END{print sum}'
5、统计apache访问⽇志流量排名前10个ip?
awk '{print $1}' /var/log/httpd/access_log | uniq -c|sort -rn|head -10
如果没有需要安装httpd,yum install -y httpd,新安装没有日志,可以通过使用浏览器访问http://xx.xx.xx.xx,或者其他linux服务器使用curl ip也可以
文本处理三剑客之awk
-
定义:是一种编程语言,用于在Linux/unix下对文本和数据进行处理(在命令行中更多作为脚本来使用)
-
语法格式
awk -F: ‘command’ filenames
command:
BEGIN{} {} END{}
行处理前 行处理 行处理后
-
内置变量
内置变量 描述 RS 行分隔符,默认情况下为一个换行符(不显示在终端上) ORS 输出行分隔符,用于打印时分割记录(不换行,一个紧挨着一个,会显示在终端上) NR 表示当前的行数(不同的目录可以统计在一块计数) FNR 当前输入文件的行数(不同的目录分开统计) NF 表示当前的列数(显示出每一行有几个字段) FS 列分隔符,默认空格(不显示在终端上) OFS 输出列分隔符,用于打印时分割字段(显示在终端上)
例如:
RS
`[root@localhost ~]# awk 'BEGIN{RS=" "}{print $0}' /etc/passwd`
`ftp:x:14:50:FTP`
`User:/var/ftp:/sbin/nologin`
`nobody:x:99:99:Nobody:/:/sbin/nologin`
`systemd-network:x:192:192:systemd`
`Network`
`Management:/:/sbin/nologin`
`dbus:x:81:81:System`
`message`
`bus:/:/sbin/nologin`
ORS
``[root@localhost ~]# awk 'BEGIN{ORS=";"}{print $0}' /etc/passwd`
`root:x:0:0:root:/root:/bin/bash;bin:x:1:1:bin:/bin:/sbin/nologin;daemon:x:2:2:d aemon:/sbin:/sbin/nologin;adm:x:3:4:adm:/var/adm:/sbin/nologin;lp:x:4:7:lp:/var /spool/lpd:/sbin/nologin;sync:x:5:0:sync:/sbin:/bin/sync;shutdown:x:6:0:shutdow n:/sbin:/sbin/shutdown;halt:x:7:0:halt:/sbin:/sbin/halt;mail:x:8:12:mail:/var/s pool/mail:/sbin/nologin;operator:x:11:0:operator:/root:/sbin/nologin;games:x:12 :100:games:/usr/games:/sbin/nologin;ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin``
- **NR**
`[root@localhost ~]# awk '{print NR, $0}' /etc/passwd /etc/hosts`
`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 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4`
`6 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6`
FNR
`[root@localhost ~]# awk '{print FNR, $0}' /etc/passwd /etc/hosts`
`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`
`1 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4`
`2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6`
NF
`[root@localhost ~]# awk -F: '{print $0,NF}' /etc/passwd`
`root:x:0:0:root:/root:/bin/bash 7`
`bin:x:1:1:bin:/bin:/sbin/nologin 7`
`daemon:x:2:2:daemon:/sbin:/sbin/nologin 7`
`adm:x:3:4:adm:/var/adm:/sbin/nologin 7`
FS
`[root@localhost ~]# awk 'BEGIN{FS=":"}{print $1,$3}' /etc/passwd`
`root 0`
`bin 1`
`daemon 2`
OFS
`[root@localhost ~]# awk 'BEGIN{FS=":";OFS="+"}/root/{print $1,$2}' /etc/passwd`
`root+x`
`operator+x`
文本处理三剑客之sed
-
定义: 是一种非交互式的流式编辑器
-
sed工作原理:sed处理文件时,会把当前处理的行保存在一个临时缓存区中(也叫模式空间),处理完模式空间中的行后,就会发送到屏幕上。 注:sed把每一行都存在模式空间中进行编辑,随意不会修改或破坏源文件。
-
用法: sed 选项 ‘script(地址定界编辑命令)’ 文件名
eg: sed ‘/north/p’ sed.txt
sed把所有输入行都打印在标准输出上。如果在某一行有 north ,就把该行在打印一遍。
文本处理三剑客之grep
- 概念:是一种强大的文本搜索工具,可以使用正则表达式搜索文本并把匹配的行打印出来
- 作用:可以根据用户指定的过滤条件对目标文本逐行进行匹配检查并打印出来