一.awk:
格式: awk '{pattern + action}' {fileName}
awk的调用方式:
a.命令行方式:
awk [ -F fileId-separator] 'commands' input_file
commands是真实要执行的命令,[ -F fileId-separator]是可填项,input_file是待处理文件,在awk中,文件的每一行中,由域分隔符分开的每一项都是一个域,通常,在不知道-F后面的分隔符seperator的时候,默认分隔符是空格。
b.shell脚本方式:
将awk指令写入到一个文件中,通过使用awk的解释器来执行文件
即将脚本的头行 #!bin/sh 改成 #!bin/awk 这样通过脚本名称即可调用
c.将所有的awk命令都抽取出到一个文件中,然后去执行
awk -f awk-script-file input_file
其中awk是加载awk-script-file中的wak脚本,输出到待处理文件input-file中,做统一调用。
实例:
last -n 5 | awk '{print $1}' -------打印第一列数据
awk的工作流程;awk读入按‘\n’换行符分割,读取每行的时候,安装域分隔符来读取,默认的域分隔符是空格或者tab键,其中$0是整个域,$1是第一个域,$n是第n个域,所以这里第一个域就是用户名。
cat /etc/password | awk -F ‘:’ ‘{print $1}’ ---打印密码,分隔符是分号。(这种是分隔符和action实例)
cat /etc/password | awk -F ':' '{print $1 "\t"$7}' -----tab符分割第一个域和第七个域
cat /etc/password | awk -F ':' 'BEGIN{print "name,shell"} {print $1","$7} END{print "blue,/bin/nosh"}' -------------x先执行begin,在执行action,最后执行end内容
awk -F : '/root/' /etc/passwd 搜索含有root关键字的所有行
awk -F : '/root/{print $7}' /etc/passwd 搜索含root关键字的行并打印第七个域
awk的内置变量:
ARGC : 命令行参数个数
ARGV:命令行参数排列
ENVIRON:支持队列中系统环境变量使用
FILENAME:文件名称
FNR:浏览的文件记录数
FS:设置输入域分隔符,等价于 -F选项
NR:浏览的记录数
NF:浏览的域的个数
OFS:输出域分隔符
ORS:输出记录分隔符
RS:控制记录分隔符
awk -F ":" '{print "fileName:"FILENAME ",linenumber:"NR ",linecontent:"NF ",linecontent:" ORS}' ----输出特定的变量。
也可以使用printf替换print,如下:
awk -F ":" '{printf (
"filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}'