作用
切片,显示信息的,按列显示,也是逐行处理的
语法
awk [options] 'commands' file
==options
-F可以指定分割符,默认分隔符为空格或制表符TAB,-F
==command(时空)
BEGIN{}
{}
END{}
awk -F: 'BEGIN{print "awk开始"}{print $0}END{print "awk结束"}' passwd.txt
#############################################################
awk开始
root:x:0:0:root:/root:/bin/bash1
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin2
bin:x:2:2:bin:/bin:/usr/sbin/nologin3
sys:x:3:3:sys:/dev:/usr/sbin/nologin4
sync:x:4:65534:sync:/bin:/bin/sync5
games:x:5:60:games:/usr/games:/usr/sbin/nologin6
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin7
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin8
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin9
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin10
awk结束
awk [options] 'pattern{action}' {filenames}
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项参数说明
选项参数 | 功能 |
---|---|
-F | 指定输入文件拆分分隔符 |
-v | 赋值一个用户定义变量 |
awk内置变量
内置变量 | 含义 |
---|---|
ARGC | 命令行参数个数 |
ARGV | 命令行参数排列 |
ENVIRON | 支持队列中系统环境变量的使用 |
FILENAME | awk浏览的文件名 |
FNR | 浏览文件的记录数 |
FS | 设置输入域分隔符,等价于命令行 -F选项 |
NF | 浏览记录的域的个数, 根据分隔符分割后的列数(列数) |
NR | 已读的记录数, 也是行号(行号) |
OFS | 输出域分隔符 |
ORS | 输出记录分隔符 |
RS | 控制记录分隔符 |
$n |
$0 变量是指整条记录。$1 表示当前行的第一个域,$2 表示当前行的第二个域,......以此类推。 |
$NF | $NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数 |
示例
#数据准备
cp /etc/passwd ./
#默认每行空格切割数据
echo "abc 123 456" | awk '{print $1"&"$2"&"$3}'
#打印含有匹配信息的行
awk '/root/ {print $0}' passwd
awk '/root/' passwd
#打印匹配行中第7列数据
awk -F: '/root/ {print $7}' passwd
#统计passwd: 文件名,每行的行号,每行的列数,对应的完整行内容
awk -F: '{print "文件名:" FILENAME "行号" NR "列数" NF "内容" $0}' passwd
#使用printf替代print,可以让代码阅读型更好
awk -F: '{printf("文件名:%s,行号 %s,列数 %s 内容 %s\n",FILENAME,NR,NF,$0)}' passwd
#打印第二行信息
awk -F ':' 'NR==2{printf("filename:%s,%s\n",FILENAME,$0)}' passwd
#查找以c开头的资源
ls -a | awk '/^c/'
#打印第一列
awk -F: '{print $1}' passwd
#打印最后1列
awk -F: '{print $NF}' passwd
# 打印倒数第二列
awk -F: '{print $(NF-1)}'
#打印10到20行的第一列
awk -F: '{if(NR>=10 && NR<=20) print $1}' passwd
#多分隔符使用
echo "abc/123:456" | awk -F "[:/]" '{print $0,$1,$2,$3}'
echo "one:two/three" | awk -F '[:/]' '{printf("%s\n%s\n%s\n%s\n",$0,$1,$2,$3)}'
#添加开始与结束内容
echo -e "abc\nabc" | awk 'BEGIN{print "开始..."} {print $0} END{print "结束..."}'
#使用循环拼接分割后的字符串
echo "1111 222 33 44" | awk -v str="" '{for(n=1;n<=NF;n++) { str=str$n } print str}'
#操作指定数字运算
echo "2.1" | awk -v i=1 '{print $0+i}'
#切割ip
ifconfig | awk '/broadcast/{print $0}' | awk '{print $2}'
#显示空行行号
sed 'G' sed.txt | awk '/^$/{print NR}'
#
小结
grep , sed ,awk , cut 文本字符串操作四剑客的区别
grep:用于查找匹配的行
cut: 截取数据. 截取某个文件中的列, 重点是按照列分割, 这个命令不适合截取文件中有多个空白字符的字段
sed: 增删改查数据. sed用于在文件中以行来截取数据进行增\删\改\查
awk:截取分析数据. 可以在某个文件中是以竖列来截取分析数据, 如果字段之间含有很多空白字符也可以获取需要的数据, awk是一种语言,可以深入分析文件数据