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\n"} {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"\t $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

字符串屏蔽序列

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

总结:

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

时间: 2024-10-24 12:03:10

awk的用法的相关文章

awk基本用法

RS,ORS,FS,OFS,NR,NF,$0,$n RS 输入的行分隔号 ORS 输出的行分隔号 FS 输入的列分隔号 OFS 输出的列分隔号 NR 行号 NF 尾列号 $0 表示所有列(整行) $n 表示第n列 例如: shell> cat aa 1 2 3 4 5 6 shell> awk 'BEGIN{ORS=",\n"}{print}' aa 1 2, 3 4, 5 6, RS反之 shell> awk 'BEGIN{ORS=",\n"}{

Linux sed 和 awk的用法

sed用法: 原文链接:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed [-nefri] 'command' 输入文本 常用选项:        -n∶使用安静(silent)模式.在一般 sed 的用法中,所有来自

AWK详细用法

awk非常的优秀,运行效率高,而且代码简单,对格式化的文本处理能力超强.基本上grep和sed能干的活awk全部都能干,而且干得更好. 先来一个很爽的例子:文件a,统计文件a的第一列中是浮点数的行的浮点数的平均值.用awk来实现只需要一句话就可以搞定(当然,这个东东用python也可以很轻松的实现,只是无论如何都得新建一个文件:别妄想用bash shell来做,那可是浮点数!!!)$cat a1.021 331#.ll   442.53 6ss    7awk 'BEGIN{total = 0;

awk数组用法

两个文件,从文件b首列查找出等于文件a的行并输出[[email protected] ~]# cat a1367[[email protected] ~]# cat b1 2 32 3 43 4 54 5 65 6 76 7 87 8 9 shell脚本[[email protected] ~]# cat jieguo #!/bin/bashy=`sed -n 'p' a |wc -l`  #a 行数x=`sed -n 'p' b |wc -l`  #b行数for((i=1;i<=$y;i++)

awk基本用法(一)

awk从FILE中读取文件,并采用指定的分隔符(默认为空格),将其分为多个段,每一个段的内容都放在$n(n为数字)中.$0表示一整行的内容. awk的用法: awk 'PATTERN{ACTION}' FILE 说明: PATTERN:为匹配模式.如果没有PATTERN,则表示匹配所有. ACTION:对匹配的内容所执行的操作.最简单的ACTION为print 内置变量: NF:表示的是Number of Field,即字段个数.如果是$NF,则表示的是最后一个字段. 示例1: [[email 

awk简单用法

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. 1.域分割符 awk 在没有使用-F 指定分割符的时候.默认以空格为分割符. 域分割 $0代表文本内容全文显示 $1 代表分割第一个域 $2 代表分割第二个域 依

awk命令用法及编程

awk(gawk):报告生成器,格式化文本输出:awk,gawk 基本用法:gawk [options] 'program' FILE ... program: PATTERN{ACTION STATEMENT};可以有多个,语句之间用分号分隔 print,printf 选项: -F:指明输入数据时用到的字段分隔符 -v var=value:自定义变量: 变量: 1)内建变量 FS:input field seperator(输入字段分隔符,默认为空白字符) #awk -v FS=':' '{p

awk常见用法总结

split用法 echo "hello_xiao_lan" | awk '{split($0,b,"_");print b[3]}' //substr用法 awk '{a=substr($1,2);print a}' file2 //求均值 awk '{ sum = $1+sum ;count++ } END {print count, sum,sum/count}' aa.txt awk '{max=($2>max?$2:max)} END {print m

awk的用法(转)

awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输入域分隔符,默认为一个空格 RS 输入记录分隔符 NF 当前记录里域个数 NR 到目前为止记录数 OFS 输出域分隔符 ORS 输出记录分隔符 1.awk '/101/'               file 显示文件file中包含101的匹配行.    awk '/101/,/105/'     

awk基础用法

awk是神通广大的工具,不学一下的话,shell脚本写起来真的好艰难... awk有很多不同的版本,这里采用的是gawk(依我看,功能都差不多),它用来检索一些文件,从中找出匹配指定模式的行,然后在这些行上执行指定的动作. 基本格式如下: gwak options 'pattern {action}' file-list 其中,file-list是gawk的数据来源:options是一些特定的选项:主要部分"模式+动作"必须要放在单引号内,而且动作还要用花括号括起来.主要部分如果太多的