if (expression) { statement; statement; ... ... } if (expression) { statement; } else { statement2; } if (expression) { statement1; } else if (expression1) { statement2; } else { statement3; }
计算文件夹中文件占用的字节数,并过滤4096个大小的文件(通常是文件夹):
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"}'
[end]size is 8.22339 M
循环语句
awk中的loop语句也从C语言中借用,并支持while,do / while,for,break和Continue. 这些关键字的语义与C语言中的语义完全相同.
数组
由于awk中数组的下标可以是数字和字母,因此数组的下标通常称为键. 值和关键字存储在用于键/值哈希的内部表中. 由于哈希没有按顺序存储,因此您会发现在显示数组的内容时,它们不会按预期的顺序显示. 使用数组和变量时会自动创建它们. Awk还会自动确定它存储数字还是字符串. 通常,awk中的数组用于从记录中收集信息,这些记录可用于计算总和,对单词计数,跟踪模板匹配的次数等等.
显示/ etc / passwd的帐户
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd 0 root 1 daemon 2 bin 3 sys 4 sync 5 games ......
这里我们使用for循环遍历数组
awk编程内容非常多,这里仅列出简单和常用的用法
================================================ ================================================== ====
awk是一种行处理器: 与屏幕处理的优点相比,处理大文件时不会出现内存溢出或处理速度慢的问题. 通常用于格式化文本信息
awk处理过程: 依次处理每行,然后输出
Awk命令格式:
awk [-F | -f | -v]‘BEGIN {} // {command1; command2} END {}”文件
[-F | -f | -v]大参数,-F指定分隔符,-f调用脚本,-v定义变量var = value
''参考代码块
开始初始化代码块. 在处理每一行之前,初始化代码主要引用全局变量并设置FS分隔符
//匹配的代码块,可以是字符串或正则表达式
{}命令代码块,包含一个或多个命令
;多个命令之间用分号分隔
END结束代码块,这是在处理每一行之后执行的代码块,主要用于最终计算或输出结束摘要信息
特殊点:
$ 0表示整个当前行
$ 1每行的第一字段
NF场量变量
每行NR记录号,多文件记录增量
FNR与NR类似,但是多文件记录不会递增,每个文件从1开始
\ t标签
\ n换行符
在FS开始时定义分隔符
RS输入记录分隔符,默认为换行符(即,文本逐行输入)
〜匹配,与==
的比较不完全
! 〜不匹配,比较不准确
==相等,必须全部相等,精确比较
! =不相等,精确比较
&&逻辑与
||逻辑或
+匹配时,表示一个或多个
/ [0-9] [0-9] + /两个或多个数字
/ [0-9] [0-9] * /一个或多个数字
FILENAME文件名
OFS输出字段分隔符,默认也是一个空格,可以更改为制表符等.
记录由ORS输出的分隔符,默认为换行符,即处理结果也逐行输出到屏幕上
-F'[: #/]'定义了三个分隔符
打印&$ 0
print是awk打印指定内容的主要命令
awk'{print}'/ etc / passwd == awk'{print $ 0}'/ etc / passwd
awk'{print“”}'/ etc / passwd //不输出passwd的内容,但输出相同数量的空行,进一步说明awk逐行处理文本
awk'{print“ a”}''/ etc / passwd //输出相同的行数,每行只有一个字母
awk -F“: ”'{print $ 1}'/ etc / passwd
awk -F: '{print $ 1; print $ 2}'/ etc / passwd //每行的前两个字段在单独的行中输出,以进一步了解逐行处理文本的过程
awk -F: '{print $ 1,$ 3,$ 6}'OFS =“ \ t” / etc / passwd //输出字段1,3,6,以制表符作为分隔符
-f指定脚本文件
awk -f script.awk文件
BEGIN {
FS =“: ”
{print $ 1} //效果与awk -F“: ”'{print $ 1}'相同,除了使用FS在代码本身中指定分隔符
awk'开始{X = 0} / ^ $ / {X + = 1} END {打印“我发现”,X,“空白行”. }'测试
我发现4个空行.
ls -l | awk'BEGIN {sum = 0}! / ^ d / {sum + = $ 5} END {打印“ total size is”,sum}'//计算文件大小
总大小为17487
-F指定分隔符
$ 1是指定分隔符后的第一个字段,$ 3是第三个字段,\ t是制表符
将一个或多个连续的空格或制表符视为一个定界符,即,将多个空格视为一个空格
awk -F“: ”'{print $ 1}'/ etc / passwd
awk -F“: ”'{print $ 1 $ 3}'/ etc / passwd // $ 1和$ 3连接且输出时没有分隔
awk -F“: ”'{print $ 1,$ 3}'/ etc / passwd //多余的逗号$ 1和$ 3用空格隔开
awk -F“: ”'{print $ 1“” $ 3}'/ etc / passwd //在$ 1和$ 3之间手动添加空格以分隔
awk -F“: ”'{print“用户名: ” $ 1“ \ t \ t Uid: ” $ 3}''/ etc / passwd //自定义输出
awk -F: '{print NF}'/ etc / passwd //显示每行有多少字段
awk-F: '{print $ NF}'/ etc / passwd //打印每行的NF字段的值
awk -F: 'NF == 4 {print}'/ etc / passwd //仅显示4个字段的行
awk -F: 'NF> 2 {print $ 0}'/ etc / passwd //显示每行超过2个字段的行
awk'{print NR,$ 0}'/ etc / passwd //输出每行的行号
awk -F: '{print NR,NF,$ NF,“ \ t”,$ 0}'/ etc / passwd //打印行号,字段号,最后一个字段值,制表符,每行内容
awk -F: 'NR == 5 {print}'/ etc / passwd //显示第5行
awk -F: 'NR == 5 || NR == 6 {print}'/ etc / passwd //显示第5和6行
路线-n | awk'NR! = 1 {print}'//不显示第一行
//匹配代码块
//纯字符匹配! //纯字符不匹配〜//字段值匹配! 〜//字段值不匹配〜/ a1 | a2 /字段值匹配a1或a2
awk'/ mysql /'/ etc / passwd
awk'/ mysql / {print}'/ etc / passwd
awk'/ mysql / {print $ 0}'/ etc / passwd //这三个指令的结果相同
awk'! / mysql / {print $ 0}'/ etc / passwd //输出行与mysql不匹配
awk'/ mysql |邮件/ {print}'/ etc / passwd
awk'! / mysql |邮件/ {print}'/ etc / passwd
awk -F: '/ mail /,/ mysql / {print}'/ etc / passwd //间隔匹配
awk'/ [2] [7] [7] * / {print $ 0}'/ etc / passwd //匹配以数字27开头的行,例如27,277,2777 ...
awk -F: '$ 1〜/ mail / {print $ 1}'/ etc / passwd // $ 1仅在显示指定内容时匹配
awk -F: '{if($ 1〜/ mail /)print $ 1}'/ etc / passwd //与上面相同
awk -F: “ $ 1! 〜/ mail / {print $ 1}'/ etc / passwd //不匹配
awk -F: “ $ 1! 〜/邮件| mysql / {print $ 1}'/ etc / passwd
必须在{}中使用,并且比较内容用()扩展
awk -F: '{if($ 1〜/ mail /)print $ 1}'/ etc / passwd //速记
awk -F: '{if($ 1〜/ mail /){print $ 1}}'/ etc / passwd //全部写入
awk -F: '{if($ 1〜/ mail /){print $ 1} else {print $ 2}}'/ etc / passwd //如果... else ...
条件表达式
==! = >> =
awk -F“: ”'$ 1 ==“ mysql” {print $ 3}'/ etc / passwd
awk -F“: ”'{if($ 1 ==“ mysql”)print $ 3}'/ etc / passwd //与上面相同
awk -F“: ”'$ 1! =“ mysql” {print $ 3}'/ etc / passwd //不相等
awk -F“: ”'$ 3> 1000 {print $ 3}'/ etc / passwd //大于
awk -F“: ”'$ 3> = 100 {print $ 3}'/ etc / passwd //大于或等于
awk -F“: ”'$ 3 <1 {print $ 3}'/ etc / passwd //小于
awk -F“: ”'$ 3 <= 1 {print $ 3}'/ etc / passwd //小于或等于
逻辑运算符
&& ||
awk -F: '$ 1〜/ mail / && $ 3> 8 {print}'/ etc / passwd //逻辑与,$ 1匹配mail,$ 3> 8
awk -F: '{if($ 1〜/ mail / && $ 3> 8)print}'/ etc / passwd
awk -F: '$ 1〜/ mail / || $ 3> 1000 {print}'/ etc / passwd //逻辑或
awk -F: '{if($ 1〜/ mail / || $ 3> 1000)print}'/ etc / passwd
数值运算
awk -F: '$ 3> 100'/ etc / passwd
awk -F: '$ 3> 100 || $ 3 <5'/ etc / passwd
awk -F: '$ 3 + $ 4> 200'/ etc / passwd
awk -F: '/ mysql | mail / {print $ 3 + 10}'/ etc / passwd //在第三个字段中添加10以进行打印
awk -F: '/ mysql / {print $ 3- $ 4}'/ etc / passwd //减法
awk -F: '/ mysql / {print $ 3 * $ 4}'/ etc / passwd //乘积
awk'/ MemFree / {print $ 2/1024}'/ proc / meminfo //部门
awk'/ MemFree / {print int($ 2/1024)}'/ proc / meminfo //四舍五入
输出分隔符OFS
awk'$ 6〜/ FIN / || NR == 1 {print NR,$ 4,$ 5,$ 6}'OFS =“ \ t” netstat.txt
awk'$ 6〜/等待/ || NR == 1 {print NR,$ 4awk数组长度,$ 5,$ 6}'OFS =“ \ t” netstat.txt
//输出字段6与WAIT行匹配,该行输出每行的行号,字段4、5、6,并使用制表符分隔字段
将处理结果输出到文件
①直接输出路径-n | awk'NR! = 1 {print>“ ./fs”}'在命令代码块中
②使用重定向输出路径-n | awk'NR! = 1 {print}'> ./fs
格式化输出
netstat -anp | awk'{printf“%-8s%-8s%-10s \ n”,$ 1,$ 2,$ 3}'
printf表示格式输出
%格式化的输出分隔符
-8长8个字符
s表示字符串类型
打印每行的前三个字段,指定第一个字段输出字符串类型(长度8),第二个字段输出字符串类型(长度8),
第三个字段输出字符串类型(长度为10)
netstat -anp | awk'$ 6 ==“听” || NR == 1 {printf“%-10s%-10s%-10s \ n”,$ 1,$ 2,$ 3}'
netstat -anp | awk'$ 6 ==“听” || NR == 1 {printf“%-3s%-10s%-10s%-10s \ n”,NR,$ 1,$ 2,$ 3}'<
awk -F: '{if($ 3> 100)打印“大”;否则打印“ small”}'/ etc / passwd
小
小
小
大
小
小
awk -F: 'BEGIN {A = 0; B = 0} {if($ 3> 100){A ++;打印“大”}其他{B ++;打印“小”}} END {打印A,“ \ t”,B}'/ etc / passwd
// ID大于100,A加1,否则B加1
awk -F: '{if($ 3 <100)接下来; else print}'/ etc / passwd //跳过少于100,否则显示
awk -F: 'BEGIN {i = 1} {if(i awk -F: 'BEGIN {i = 1} {if(i 另一种形式 awk -F: '{print($ 3> 100?“ yes”: “ no”)}'/ etc / passwd awk -F: '{print($ 3> 100?$ 3“: \ tyes”: $ 3“: \ tno”)}''/ etc / passwd awk -F: 'BEGIN {i = 1} {while(i 7个根1 7 x 2 7 0 3 7 0 4 7根5 7 /根6 netstat -anp | awk'NR! = 1 {a [$ 6] ++} END {for(i in a)print i,“ \ t”awk数组长度,a [i]}' netstat -anp | awk'NR! = 1 {a [$ 6] ++} END {对于(i in a)printf“%-20s%-10s%-5s \ n”,i,“ \ t”,a [i]}' 9523 1 9929 1 听6 7903 1 3038 / cupsd 1 7913 1 10837 1 9833 1 awk -F: '{print NF}'helloworld.sh //输出文件每一行中有多少个字段 awk -F: '{print $ 1,$ 2,$ 3,$ 4,$ 5}'helloworld.sh //输出前5个字段 awk -F: '{print $ 1,$ 2,$ 3,$ 4,$ 5}'OFS ='\ t'helloworld.sh //输出前5个字段并使用制表符分隔输出<
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-176501-1.html
老百姓希望经济形势好转
而不是大陆