[关闭]
@breakerthb 2017-02-20T02:46:49.000000Z 字数 1230 阅读 1230

awk

Linux Shell


功能

数据处理工具

格式

awk '条件类型1{动作1} 条件类型2{动作 2}...' filename
awk '{pattern + action}' {filenames} 

支持管道操作

last -n 5 | awk '{print $1  "\t"  $3}'

列操作

$0 表示所有列
    $n 第n列

EG

awk '{print $0}' filename 打印全文
    awk '{print $1}' filename 打印第1列
    awk '{print $1,$3}' filename 打印第1列和第3列(中间以分隔符隔开)

模式

1. 匹配:/匹配内容/

匹配只对紧跟着的花括号起作用

EG
awk '/AL/ {print 2}' filename 打印有AL字段的第三列和第二列
awk '/AL/ {print 2}{print $4}' filename 不管找没找到都打印第四列
awk '/AL/' filename 不指定打印字段,全输出

2.; 分割

$ awk '/AL/ {print $3,$2 ; print $4,$5}' filename 分两行打印

3. 转义字符

""中打印分隔符...

$ awk '/AL/ {print $3"-"$2"\n"}' filename

4. 设置分隔符

BEGIN {FS=" "}

awk -F "/" '{print $1}' 
    awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t" $3}'

应用

1. INI文件读取

CFG_PATH=path.cfg
for line in `cat $CFG_PATH`
do
    #echo $line
    name=`echo $line|awk -F=  '{print $1}'`
    path=`echo $line|awk -F= '{print $2}'`
done  

2. awk内置字符串函数

gsub(r,s) 在整个$0中用s替代r;gsub(r,s,t) 在整个t中用s替代r
    gsub函数有点类似于sed查找和替换。它允许替换一个字符串或字符为另一个字符串或字符,并以正则表达式的形式执行。第一个函数作用于记录$0,第二个gsub函数允许指定目标,然而,如果未指定目标,缺省为$0。
    index(s,t):函数返回目标字符串s中查询字符串t的首位置。
    length(s) :返回s长度
    match(s,r): 测试s是否包含匹配r的字符串
    split(s,a,fs) 在fs上将s分成序列a
    sprint (fmt,exp) :函数类似于printf函数(以后涉及),返回基本输出格式fmt的结果字符串exp。
    sub(r,s) 用$0中最左边最长的子串代替s
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分。
match函数测试字符串s是否包含一个正则表达式r定义的匹配。
split使用域分隔符fs将字符串s划分为指定序列a。

awk '{if($4<300&&$5<300)print $1" "$2" "$3" "$4" "$5}'

内置变量

NF  每一行拥有的字段总数
NR  当前行
FS  目前分隔符
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注