shell编程awk基础介绍
Posted 不懂123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程awk基础介绍相关的知识,希望对你有一定的参考价值。
awk介绍
报告生成器,格式化文本输出
处理机制类似sed命令,自带循环处理 读入一行处理一行然后自动读取下一行再进行处理
sed命令换行的标识是固定的,只能是回车换行. awk里面的换行符是可以自定义的.
awk自动把读入的行按照指定的切割符号切割成若干个字段 默认的切割符号是空白符号(包括连续的空白符号,tab键,回车换行符)
基础语法
awk [options] \'program\' var=value file
awk [options] -f programfile var=value file
awk [options] \'BEGIN{action;..} pattern{ action;....} END {action;....}\' file
通常由: BEGIN语句块 能够使用模式匹配的通用语句块 END语句块 三部分组成
第一步: 先执行 BGEIN 语句块 经常用于打印表头
第二步: 从文件或者标准输入读取一行,然后执行pattern语句 它会逐行扫描文件,直到文件全部读取完毕
第三步: 处理完文件或者输入流的最后一行后,最后执行的语句块 经常用于进行数据汇总
pattern语句如果没有提供 默认执行 {print } 就是打印每一个读取到的行
选项 options
-F 指明输入时用到的字段分隔符号
-v var=value 自定义变量
awk内置变量
FS 表示把行按照这个变量进行切割成列
OFS 表示按这个字符把列进行拼装组合输出
RS 表示按照这个变量作为行的分隔符
ORS 表示以这个符号连接每行输出的结果
NF 表示字段的数量大小
NR 表示行号
FNR 多个文件的时候各自的文件行号
FILENAME 表示当前的文件名称
FS:输入字段分隔符,默认为空白字符
awk -v FS=\':\' \'{print $1,FS,$3}’ /etc/passwd
awk –F: \'{print $1,$3,$7}’ /etc/passwd
OFS:输出字段分隔符,默认为空白字符
awk -v FS=‘:’ -v OFS=‘:’ \'{print $1,$3,$7}’ /etc/passwd
RS:输入记录分隔符,指定输入时的换行符 默认是换行符
awk -v RS=\' \' ‘{print }’ /etc/passwd
ORS:输出记录分隔符,输出时用指定符号代替换行符 默认是换行符
awk -v RS=\' \' -v ORS=\'###\'‘{print }’ /etc/passwd
NF:字段数量
awk -F: ‘{print NF}’ /etc/fstab
awk -F: \'{print NF,"----"$NF"----"$(NF-1)}\' /etc/passwd
引用内置变量不用$
awk -F: \'{print $(NF-1)}\' /etc/passwd
NR:记录号
awk \'{print NR}\' /etc/fstab ; awk END\'{print NR}\' /etc/fstab
FNR:各文件分别计数自己的记录号
awk \'{print FNR}\' /etc/fstab /etc/inittab
FILENAME:当前文件名
awk \'{print FILENAME}’ /etc/fstab
ARGC:命令行参数的个数
awk \'{print ARGC}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
ARGV:数组,保存的是命令行所给定的各参数
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab ARGV[0]代表的awk自己本身 ARGV[1] 代表/etc/fstab ARGV[2]代表/etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
awk自定义变量
自定义变量(区分字符大小写)
(1) -v var=value
(2) 在program中直接定义
(3) 变量最好先定义赋值然后再去使用
printf格式化输出
1.输出信息默认不会换行,需要显示指定换行控制符 \\n
格式符:
1. %c 显示字符的ASCII码
2. %d,%i 显示十进制数字
3. %s 显示字符串
4. %% 显示%自身
5. %f 显示浮点数
awk -F: \'{printf "%s:%s\\n",$1,$3}\' /etc/passwd
awk -F: \'BEGIN{print "username uid"}{printf"%s %s\\n", $1,$3}\' /etc/passwd
awk实例
1 从文件中读取program 2 cat awkscript 3 {print script,$1,$2} 4 [root@centos7 ~]# awk -F: -f awkscript script="awkkk" /etc/passwd 5 awkkk root x 6 awkkk bin x 7 awkkk daemon x 8 [root@centos7 ~]# awk -F: \'{printf"Username: %s\\n",$1}\' /etc/passwd 9 Username: root 10 Username: bin 11 Username: daemon 12 输出json字典 13 [root@centos7 ~]# awk -F: \'{printf "Username:%s,UID:%d\\n",$1,$3}\' /etc/passwd 14 Username:root,UID:0 15 Username:bin,UID:1 16 [root@centos7 ~]# awk -F: \'$0 ~ /root/{print $1}\' /etc/passwd 17 root 18 operator 19 rooter 20 [root@centos7 ~]# awk -F: \'$0 ~ /^root/{print $1}\' /etc/passwd 21 root 22 rooter 23 awk \'$0 !~ /root/\' /etc/passwd 24 bin:x:1:1:bin:/bin:/sbin/nologin 25 daemon:x:2:2:daemon:/sbin:/sbin/nologin 26 [root@centos7 ~]# awk -F: \'$3==0\' /etc/passwd 27 root:x:0:0:root:/root:/bin/bash
1 [root@centos7 ~]# awk \'{print 2^10}\' 2 e 3 1024 4 [root@centos7 ~]# awk -F: \'{print $1":"$3}\' /etc/passwd 5 root:0 6 bin:1 7 daemon:2 8 [root@centos7 ~]# df | awk \'{print $1,$3}\' 9 Filesystem Used 10 /dev/sda2 4347496 11 devtmpfs 0 12 tmpfs 0 13 [root@centos7 ~]# awk -v FS=: \'{print $1,$3}\' /etc/passwd 14 root 0 15 [root@centos7 ~]# awk -v FS=: \'{print $1FS$3}\' /etc/passwd 16 root:0 17 shell变量传递给awk 18 [root@centos7 ~]# fs=":";awk -v FS=$fs \'{print $1FS$3}\' /etc/passwd 19 root:0 20 bin:1 21 22 [root@centos7 ~]# awk -v ORS="****" \'{print $1}\' a2 23 1****3****o****2****o****4****You have new mail in /var/spool/mail/root 24 [root@centos7 ~]# awk \'{print $1}\' a2 25 1 26 3 27 o 28 2 29 o 30 4
1 [root@centos7 ~]# df | grep \'^/dev/sd\'|awk \'{print $1,$5}\' 2 /dev/sda2 9% 3 /dev/sda3 1% 4 /dev/sda1 20% 5 [root@centos7 ~]# df | grep \'^/dev/sd\'|awk -v FS=% \'{print $1}\' 6 /dev/sda2 52403200 4347456 48055744 9 7 /dev/sda3 31441920 83004 31358916 1 8 /dev/sda1 1038336 198256 840080 20 9 [root@centos7 ~]# df | grep \'^/dev/sd\'|awk -v FS=% \'{print $1}\'|awk \'{print $1,$5}\' 10 /dev/sda2 9 11 /dev/sda3 1 12 /dev/sda1 20 13 [root@centos7 ~]# awk -F: \'{print NF,$NF,$(NF-1)}\' /etc/passwd 14 7 /bin/bash /root 15 7 /sbin/nologin /bin 16 7 /sbin/nologin /sbin 17 7 /sbin/nologin /var/adm 18 7 /sbin/nologin /var/spool/lpd
以上是关于shell编程awk基础介绍的主要内容,如果未能解决你的问题,请参考以下文章