awk使用

awk简介:
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。


awk语法:
awk '{pattern + action}' {filenames}


awk调用方式:
1.命令行方式
例:
awk -F: '/root/{print $7}' /etc/passwd #含有root的行用“:”分割后取第7个域打印
awk  '{print $1}' /etc/fstab   #每行内容用默认的空格分割,打印第1个域

2.shell脚本方式
例:
编辑文件:vim test.awk
#!/bin/awk -f
BEGIN{empty_row=0}
/^$/{empty_row++}
END{print empty_row}

改变执行权限:chmod +x test.awk

调用:test.awk /etc/fatab





3.将所有的awk命令插入一个单独文件,然后调用:awk -f awk-script-file input-file(s)
例:
编辑文件:vim test.awk
          BEGIN{empty_row=0}
          /^$/{empty_row++}
          END{print empty_row}

调用:awk -f test.awk /etc/fstab






awk内置变量:
ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符
$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
例:
##统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
awk -F ':' '{print"filename:"FILENAME",linenumber:"NR",columns:"NF",linecontet:"$0}' /etc/passwd
awk  -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd








awk编程:
1、变量和赋值
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd  ##count没有初始化时默认为0.

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}' #统计某个文件夹下的文件占用的字节数

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}'  #文件占用大小用M显示

2、条件语句:
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size}{if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'

3、数组和for循环
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;} END{for (i = 0; i <NR; i++) print i, name[i]}' /etc/passwd

4、while循环
awk -F: '{ i=1; while(i<=3){print $i ;i++}}' /etc/passwd



5、awk内置函数,字符串分割、匹配、查找、替换
awk 'BEGIN {print split("123-456-789",array_name,"-")}'   #用‘-’分隔符分割‘123-456-789’,并把分割结果存到array_name数组中,返回数组中元素个数。
awk 'BEGIN{print match("ANCD",/D/)}'  ##查找字符串‘ANCD’中是否有字串‘D’,有则返回字串位置(从1开始算)。没有则返回0
echo "J.Troll 07/99 4842 Brown-3 12 26 26" | awk '$1=="J.Troll" {sub(/26/,"29",$0);print $0}'  ##查找并替换每行第一个26成29
echo "J.Troll 07/99 4842 Brown-3 12 26 26" | awk '{if($1=="J.Troll") {sub(/26/,"29",$0);print $0}}'

echo " L.Tansl 05/99 4712 Brown-2 12 30 28" |awk '$1=="L.Tansl" {print substr($1,1,3)}' ##返回$1字串第1-3个字符串。
echo " L.Tansl 05/99 4712 Brown-2 12 30 28" |awk '$1=="L.Tansl" {print substr($1,3)}' ##返回指定位置后边的字符串。
echo " L.Tansl 05/99 4842 Brown-2 12 30 28" | awk 'gsub(/4842/,4899){print $0}'  ##查找含有4842的行,然后替换4842成4899。
awk 'BEGIN {print index("Bunny","ny")}'   ##查看ny字串出现在Bunny的位置。
awk 'BEGIN{print length("A FEW GOOD MEN")}' ##字符串长度





6、awk其实已经成为一种编程语言(个人认为太过重量级了),其它需要了解的可以参考 http://www.gnu.org/software/gawk/manual/gawk.html







##以命令行方式为例,使用例子
last -n 5 | awk '{print $1}' ##查看最近登录的用户
cat /etc/passwd | awk -F ':' '{print $1}' ##查看当前系统用户
cat /etc/passwd | awk -F ':' '{print $1"\t"$7}'##用户和时用的shell中间用tab键分割
cat /etc/passwd | awk -F ':' 'BEGIN{print "name,shell"} {print $1","$7}END{print "blue,/bin/nosh"}' ##打印表头,形成表格形式
awk -F: '/root/'  /etc/passwd ##搜索所有含有字符串‘root’的行
awk -F: '/root/{print $7}' /etc/passwd  ##打印root使用的shell





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值