目录
一、文本三剑客
1.awk 文本截取
awk是一组编程语言,gawk - pattern scanning and processing language,打印匹配扫描和处理语言的行 。
1.用途
awk可用于过滤、截取、统计
2.完整语法
awk ‘BEGIN(commands)pattern{commands}END{commands}’ file1
3.分隔符
awk的默认分隔符是空白,分隔符分为输入分隔符和输出分隔符。
① 输入分隔符:
- 默认为空白(空格和tab键)
- -F 指定分隔符
- FS 输入分隔符变量
② 输出分隔符:
- 默认为一个空格
- OFS=" " 输出分隔符变量( output field separator)
③ 举例
以 /etc/passwd 文件为例,注意要修改重要文件一定要记得备份~~
- -F 和 OFS
1、-F
[root@zabbix linux-test]# awk -F: '{print $1,$7}' /etc/passwd |head
root /bin/bash
root /bin/bash
bin /sbin/nologin
bin /sbin/nologin
daemon /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
lp /sbin/nologin
2、OFS
[root@zabbix linux-test]# awk -F: 'OFS="#"{print $1, $3,$7}' /etc/passwd
root#0#/bin/bash
root#0#/bin/bash
bin#1#/sbin/nologin
bin#1#/sbin/nologin
......
3.原passwd文件
[root@zabbix linux-test]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......
命令解析:
1. awk -F: '{print $1,$7}' /etc/passwd |head
指定 “:” 为分隔符 ,取第一列和第七列,head默认取前10行。
2. awk -F: 'OFS="#"{print $1, $3,$7}' /etc/passwd
以分号为分隔符,截取第1,3,7列,并且指定输出的分隔符为 #。
4.内置变量
- OFS 输出分隔符变量 output field separator
- FS 输入分隔符变量 input field separator
- NF 每行$0的字段数 number field
- NR 当前处理的行号
使用:
1、显示passwd文件的第5行和第10行的行号和用户名
[root@nginx-kafka01 linux-text]# awk -F':' 'NR==5 ||NR==10{print NR,$1}' /etc/passwd
5 daemon
10 lp
2.
[root@nginx-kafka01 linux-text]# awk -F: 'BEGIN{num=0;print "start"}$1 ~/^chen/&&$3>2000 ||$NF ~ /bash/ {print NR, NF, $1, $3, $(NF-1),$NF;num++}END{print "行数:"num}' /etc/passwd
start
1 7 root 0 /root /bin/bash
2 7 root 0 /root /bin/bash
41 7 chenyulin 1000 /home/chenyulin /bin/bash
42 7 chenyulin 1000 /home/chenyulin /bin/bash
43 7 echo 1001 /home/echo /bin/bas
.......
行数:36
5.流控
① if
语法:if (condition) statement1
单分支:
[root@zabbix linux-test]# awk -F: '{if($1 ~ /chen/)print "chenjie";else print "ge" }' /etc/passwd
ge
ge
......
chenjie
chenjie
.....
命令解析:
awk -F: '{if($1 ~ /chen/)print "chenjie";else print "ge" }' /etc/passwd
在 /etc/passwd 内寻找chen 如果找到了陈输出chenjie,否则就输出ge。
多分支:
[root@zabbix linux-test]# awk -F: '{if ($3==0) {num++;print $1"是超级用户"} else if ($3>1&& $3<1000) num2++;else num3++}END{print "超级用户的数量是:"num,"系统用户的数量是:"unm2, "普通用户的数量是:"num3}' /etc/passwd
root是超级用户
root是超级用户
超级用户的数量是:2 系统用户的数量是: 普通用户的数量是:38
命令解析:
在 passwd 文件里面,对$3(第三列)进行判断,如果等于0就是超级用户,在3~1000之间就是系统用户,否则就是普通用户,在里面定义了三个变量,分别对三个判断的数量进行计数。
② for
语法:for (i in array){print array[i]} 或者 for (i=0;i<10;i++){print $i}
1、
[root@zabbix ~]# awk -F: '{split($6,home,"/");for (i in home)print i,home[i]}' /etc/passwd
1
2 home
3 zhao
1
2 home
3 feng
1
2 home
3 feng
2、
[root@zabbix ~]# awk -F: '{split($6,home,"/");for (i=2;i<4;i++)print i,home[i]}' /etc/passwd
2 home
3 zhao
2 home
3 zhao
2 home
3 feng
2 home
3 feng
命令解析:
1、这两条命令都使用了split函数进行分割,split的用法 split(s, a [, r [, seps] ]),第一个命令是以“:”为分隔符,截取$6,$6再使用split将$6进行分割,分割成home和分隔符“/”,再进行循环i在home里面就打印出home。
2、这条命令与第一条差不多,解释参考第一条命令。
6.函数
常用的函数有下列几个:
- length 统计长度
- spilt 切割