您的位置:首页 > 运维架构 > Shell

SHELL [awk]

2011-07-19 18:57 246 查看
awk

最基本功能是在文件或字符串中基于制定规则浏览和抽取信息。
完整的awk脚本通常用来格式化文本文件中的信息。
[1]命令行方式

awk [-F field-separator] 'commands' input-file(s)
awk -F : 'commands' input-file
[2] 将awk命令插入一个文件,并使awk程序可执行
[3] 将所有awk命令插入一个单独文件,然后调用
awk -f awk-script-file input-files(s)
awk '{print $0}' grade.txt 只有工作部分,没有模式部分
awk '{print $1,$4}' grade.txt 只打印部分域
awk 'BEGIN {print "Name Belt\n---------------------------------"} 打印信息头

{print $1"\t"$4}' grade.txt

awk 'BEGIN {print "Name Belt\n---------------------------------"} 打印信息尾

{print $1"\t"$4} END {“end-of-report”}' grade.txt
正则表达式与操作
匹配,使用符号 ‘~’ 后紧跟正则表达式
awk '{if($4~/Brown/) print $0}' grade.txtawk '$0 ~ /Brown/' grade.txt
精确匹配
awk '{if($3=="48") print $0}' grade.txt
不匹配
awk '$0 !~ /Brown/' grade.txt
awk ‘$4 != “Brown-2” {print $0}’ grade.txt
< > <= >=
awk '$1 ~ /^...a/' grade.txt 前三个字符任意,第四个为a
awk '$0~/(Yellow|Brown)' grade.txt
awk '/^48/' grade.txt
&& || !
内置变量

awk 'END {print NR}' grade.txt

awk '{print NF, NR, $0} END{print FILENAME}' grade.txt
NF浏览记录的域个数,NR 已读的记录数
awk '{if( NR>0 && $4~/Brown/) print $0}' grade.txt
echo $PWD | awk -F/ '{print $NF}' 以/划分,显示文件名
设置域到域变量名
awk '{name=$1;belts=$4; if(belts ~ /Yellow/) print name " is belts" belts}' grade.txt
awk 'BEGIN{BASELINE="27 " if($6<BASELINE) print $0}' grade.txt
修改数值域取值
awk '$6=$6-1; print $1,$6,$7' grade.txt
修改文本域
awk '$1="J.L.Troll"; print $1' grade.txt
新建输出域
awk '$8=$7-$6; print $1,$8' grade.txt
awk 'diff=$7-$8; print diff' grade.txt
增加列值
awk '(tot+=$6); END{print "Club student total points :" tot}' grade.txt
文件长度相加
awk ' /^[^d]] {print $9"\t"$5} {tot+=$5} END {print "total KB:" tot}'
内置的字符串函数
gsub(/目标模式/, /替换模式/) 用s替代r
gsub(r,s)
gsub(r,s,t) 在t中,用s替代r
awk 'gsub(/4842/, 4899) {print $0}' grade.txt
index(s,t) s中出现t的第一个位置
awk 'BEGIN {print index("Bunny", "ny")}' grade.txt
length(s) 所需字符串的长度
awk '{print length($1) " "$1}' grade.txt
match(s,r) 测试目标字符串是否包含查找字符的一部分,返回首个位置
awk 'BEGIN { print match("ABCD", /C/)}'
split(s,a,fs) 在fs上将s分成序列a
awk 'BEGIN {print split("1234#567#89", myarray, "#")} END{ for( i in myarray){print myarray[i]}}'
substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分
awk '{print substr($1,3)}' grade.txt
awk '{print substr($1,1,5)}' grade.txt
管道将值传入awk
echo "" | awk {...}
输出函数
字符转换,格式输出,向一行命令awk传值
echo "65" | awk '{printf "%c\n", $0}' A c ASCII字符
awk 'BEGIN {printf "%f\n", 999}' 999.000000 f 浮点数
awk '{printf "%-15s %s\n", $1,$3}' grade.txt -左对齐 s 字符串
awk 命令变量=输入文件值
awk 'if($5<AGE) print $0' AGE=10 grade.txt
awk脚本文件
awk '$6=$6-1; print $1,$6,$7' grade.txtawk '$6=$6-1; print $1,$6,$7' grade.txt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: