awk的用法

前言

awk是一个模式扫描及处理语言.既然是一门语言,那么它就拥有类似于其他编程语言。所以同学们,要学好awk,必须要有shell或其他语言的编程基础,如果你没有编程基础,那么先去建立吧.

基础语法

1.awk | -F field-separator| `cmd` input file

   awk -F : `cmd` input file

2.将awk命令插入一个文件,并使awk程序可以执行,然后用awk命令解释器作为脚本首行。

3.将所有awk命令插入一个单独文件
   awk -f awk-script-file inputfile

模式和动作
模式:两个特殊断 BEGIN和END
动作:实际动作大多在{}内指明
域和记录
浏览域表记为 $1,$2,......$n($1-$n称为域标识)

例子1:

需求:对一个文本里的数据进行去重

awk 'BEGIN{count=0} {if(!a[$0]++)count++} END{print "总共有:"count}'  input file

输出

1.抽取域

awk -F: '{print $1}' /etc/passwd
2.保存输出
awk -F: '{print $1}' /etc/passwd | tee user
awk -F: '{print $1}' /etc/passwd >user
3.使用标准输出
4.打印所有记录
awk -F: '{print $0}' /etc/passwd
5.打印单独记录
awk -F: '{print $1,$4}' /etc/passwd
6.打印报告头
awk -F: 'BEGIN {print "NAME "} {print $1}' /etc/passwd
7.打印结尾
awk -F: '{print $1} END {print "this is all users"}' /etc/passwd

8.打印某一行

awk '{if(NR==1)print $0}' /etc/passwd

条件操作符

1.匹配
awk '{if($1~/root/) print $0}' /etc/passwd   //{if($1~/root/) print}表示如果field1包含root,打印它//
2.精确匹配
使用等号 ==
3.不匹配
!~
4.小于
if($6 < $7)
5.小于等于
6.大于
7.设置大小写
awk '/[Rr]oot/' /etc/passwd
8.任意字符
awk '$~/^...a/' /etc/passwd      //^...a表示第四个字幕是a//
9.或关系匹配
'$0 ~/(root|ftp)/'
10.行首
awk '/^48/' input-file       // ^48(行首包含48)
11.AND &&
'{if ($1=="P.bunny" && $4=="") print $0}'
12.OR ||

内置变量

ARCC                              命令行参数个数ARGV                          命令行参数排列
ENVIRON                        支持队列中系统环境变量的使用
FNR                                 浏览文件的记录数
FS                                    置顶分隔符,等价于-F
NF                                    浏览记录的域的个数
NR                                    已读的记录数
OFS                                  输出域分隔符
ORS                                输出记录分隔符
RS                                   控制记录分隔符

设置输入域到变量名
awk -F '{name=$1; pach=$7; if(name~/root/) print name" pach is "pach}' /etc/passwd
域值比较操作
awk '{if($6<$7) print $0}' input-file
修改改数值域取值
awk ‘{if($1="NAME) $6=$6-1; print$1,$6,$7}' input-file
修改文本域
awk ’{if($1="J.Troll") ($1="J.L.Troll); print $1}' input-file
只显示修改改记录
awk ’{if($1="J.Troll") {$1="J.L.Troll; print $1}}' input-file
创建新的输入域
awk '{if($6>$7) {$8=$6-$7; print $1,$8}' input-file
增加列值
awk '(tot=$6) END {print"..................."tot}' input-file
文件长度相加
ls -l | awk '/^[^d]/ {print $9" $5} {tot+ =$5} END {print "tltal kb:"tot}'

内置的字符窜函数

gsub(r,s)                                                                   在整个$0中用s替代r
gsub(r,s,t)                                                                 在整个t中用s替代r
index(s,t)                                                                   返回s中字符串t的第一位置
length(s)                                                                    返回s长度
match(s,r)                                                                  测试s中是否包含匹配r的字符串
split(s,a,fs)                                                                在fs上将s分成序列a
sub(s, )                                                                      用$0中最左边也是最长的字符串替代

substr(s,p,n)                                                             返回字符串s中从p开始长度为n的后缀部分
1.gsub
awk 'gsub(/4842/,4899) {print $0}' input-file             #/4842/为目标模式   4899为替换模式
awk 'gsub(/0/,2) {print $0}' /etc/fstab
awk '{print gsub(/0/,2) $0}' /etc/fstab                        
2.index查询字符串s中t出现的第一位置
awk 'BEGIN {print index("root","o")}'
awk -F: '$1=="root" {print index($1,"o")" "$1}' /etc/passwd
awk -F: '{print index($1,"o") $1}' /etc/passwd
3.length
awk -F: '{print length($1)} /etc/passwd'
awk 'BEGIN {$1="root" print length($1)'
4.match (在ANCD中查找C的位置)
awk 'BEGIN {print match("ANCD" ,/C/)}'
5.split
返回字符串数组元素个数
awk 'BEGIN {print split("123#456#789", myarray, "#")}'
6.sub 只能替换指定域的第一个0
awk '{print sub(/0/,"2",$1)' /etc/fstab
awk '{print sub(/0/,"2",$6)' /etc/fstab
7.substr 按照起始位置及长度返回字符串的一部分
awk 'BEGIN {print substr("Pavel.Nedved",7,3)}'
awk 'BEGIN {print substr("Pavel.Nedved",7)}'
awk -F: '{print substr($1,3)" " $1)}' /etc/passwd

字符串屏蔽序列

                                                                退格键
f                                                                 走纸换页
                                                                新行
                                                                 回车
                                                                 tab
c                                                                任意其他特殊字符
ddd                                                            八进制
很简单的例子
awk -F: '{print $1,""$2," "$3} /etc/passwd

总结:

此篇参考刘天斯博客的awk http://blog.liuts.com/post/53/,还有些循环控制的语法请再参考linux的man手册  man awk .

原文地址:https://www.cnblogs.com/whf191/p/5703757.html