Linux之awk命令

概念
由人名Aho,Weberger,Kernighan组合,一个行文本处理工具

语法

awk 'pattern + {action}'
(1) 单引号 ' ' 是为了和shell命令区分开;
(2) 大括号 {}表示一个命令分组;
(3) pattern 是一个过滤器,表示命中pattern的行才进行action处理;
(4) action 是处理动作;
(5) 使用#作为 注释
 案例: cat hello.txt | awk 'NR==3, NR==5 {print}'    显示hello.txt中第三行至第五行

关于pattern说明

(1)  pattern可以是正则表达式,格式为/pattern/
(2)  pattern和action可以只有其一,但是不能两者都没有
(3) 默认的action为print
案例: cat hello.txt | awk '/hello/' 显示匹配到hello的行
             cat hello.txt | awk 'length($0) > 80 {print NR}'  显示长度大于80的行号

内置变量

FS 分隔符 默认空格
NR 当前行数,从1开始
NF 当前记录总共多少列
$0 当前记录
$1 ~ $n 当前记录的第n列
案例: cat hello.txt | awk 'NR==3,NR==5 {print $1, $NF}' 显示第三、四、五行的第一列和最后一列

内置函数

gsub(r, s) 在$0中用s替换r
index(s, t) 返回s中t的第一个位置
length(s) 返回s的长度
match(s, r) s是否匹配r
split(s, a, fs) 在fs上将s分成序列a
substr(s, p) 返回s从p开始的子串

操作符

[+ - * / % ++ -- += -=] 运算符
[== != > >= ~] 逻辑符

控制流程

BEGIN和END
案例: awk 'BEGIN {count=0} {count += length($0)} END {print count}' 计算文件字符个数
流程控制
if(condition) {} else {}
while(condition){}
do{} while(condition)
for(init;condition;step){}
break; continue 

AWK和Shell交互

awk中使用shell定义的变量,用单引号括起来 
awk中使用shell命令,用双引号括起来或者用system命令   echo hello | awk 'system("date > date.txt")'
从文件读取变量到awk中用getline,echo | awk '{while(getline < "date.txt") {print $0}}'

其他案例

last -n 5 | awk -F ':' '{print $1}' //显示最后5个登录者的信息,-F指定分隔符,默认Tab或空格
cat /etc/password |awk -F ':' 'BEGIN {print 'name,shell'} {print $1","$7} END {print '.......'}' //在开始和结尾追加内容

你可能感兴趣的:(Linux)