AWK命令介绍

简介:

 

awk 语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息 awk 抽取信息后 才能进行其他文本操作 完整的 awk 脚本通常用来格式化文本文件中的信息
1.调用awk:
第一种命令行方式, :
awk [-Field-separator] 'commands' input-file(s)
这里 commands 是真正的 awk 命令 [-F 域分隔符 ] 是可选的 awk 默认使用空格分隔 因此如果要浏览域间有空格的文本 不必指定这个选项 但如果浏览如 passwd 文件 此文件各域使用冒号作为分隔符 则必须使用 -F 选项 : awk -F : 'commands' input-file
第二种 将所有 awk 命令插入一个文件 并使 awk 程序可执行 然后用 awk 命令解释器作为脚本的首行 以便通过键入脚本名称来调用它
第三种 将所有 awk 命令插入一个单独文件 然后调用,如 :
awk -f awk-script-file input-file
-f 选项指明在文件 awk-script-file awk 脚本 input-file 是使用 awk 进行浏览的文件名
2.awk脚本:
awk 脚本由各种操作和模式组成 根据分隔符 (-F 选项 ) 默认为空格 读取的内容依次放置到对应的域中 一行一行记录读取 直到文件尾
2.1.模式和动作
任何 awk 语句都是由模式和动作组成 在一个 awk 脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。动作即对数据进行的操作 如果省去模式部分 动作将时刻保持执行状态
模式可以是任何条件语句或复合语句或正则表达式 模式包含两个特殊字段 BEGIN END 使用 BEGIN 语句设置计数和打印头 BEGIN 语句使用在任何文本浏览动作之前 之后文本浏览动作依据输入文件开始执行 ;END 语句用来在 awk 完成文本浏览动作后打印输出文本总数和结尾状态标志 有动作必须使用 {} 括起来
实际动作在大括号 {} 内指明 常用来做打印动作 但是还有更长的代码如 if 和循环 looping 语句及循环退出等 如果不指明采取什么动作 awk 默认打印出所有浏览出的记录
2.2.域和记录:
awk 执行时 其浏览标记为 $1 $2...$n 这种方法称为域标记 使用 $1 $3 表示参照第 1 和第 3 注意这里使用逗号分隔域 使用 $0 表示使用所有域。例如 :
awk '{print $0}' temp.txt> sav.txt
表示打印所有域并把结果重定向到 sav.txt
awk '{print $0}' temp.txt|tee sav.txt
和上例相似 不同的是将在屏幕上显示出来
awk '{print $1,$4}' temp.txt
只打印出第 1 和第 4
awk 'BEGIN {print "NAME GRADE\n----"} {print $1"\t"$4}' temp.txt
表示打信息头 即输入的内容的第一行前加上 "NAME GRADE\n-------------" 同时内容以 tab 分开
awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp
同时打印信息头和信息尾
2.3.条件操作符:
< <= == != >= ~ 匹配正则表达式、 !~ 不匹配正则表达式
匹配 :awk '{if ($4~/ASIMA/) print $0}' temp  表示如果第四个域包含 ASIMA 就打印整条
精确匹配 :awk '$3=="48" {print $0}' temp  只打印第 3 域等于 "48" 的记录
不匹配 : awk '$0 !~ /ASIMA/' temp  打印整条不包含 ASIMA 的记录
不等于 : awk '$1 != "asima"' temp
小于 : awk '{if ($1<$2) print $1 "is smaller"}' temp
设置大小写 : awk '/[Gg]reen/' temp  打印整条包含 Green 或者 green 的记录
任意字符 : awk '$1 ~/^...a/' temp  打印第 1 域中第四个字符是 a 的记录 ,符号 ’^’ 代表 行首 ,符合 ’.’ 代表 任意字符
或关系匹配 : awk '$0~/(abc)|(efg)/' temp  使用 | 语句需要括起来
AND 与关系 : awk '{if ( $1=="a"&& $2=="b" ) print $0}' temp
OR 或关系 : awk '{if ($1=="a" || $1=="b") print $0}' temp
2.4.awk内置变量:
ARGC
命令行参数个数
NF
浏览记录的域个数
AGRV
命令行参数排列
NR
已读的记录数
ENVIRON
支持队列中系统环境变量的使用
OFS
输出域分隔符
FILENAME
awk 浏览的文件名
ORS
输出记录分隔符
FNR
浏览文件的记录数
RS
控制记录分隔符
FS
设置输入域分隔符 - F 选项
NF
浏览记录的域个数
: awk 'END {print NR}' temp  在最后打印已读记录条数
awk '{print NF NR $0} END {print FILENAME}' temp
awk '{if (NR>0 && $4~/Brown/) print $0}' temp  至少存在一条记录且包含 Brown
NF 的另一用法 : echo $PWD | awk -F/ '{print $NF}'  显示当前目录名
2.5.awk操作符:
awk 中使用操作符 基本表达式可以划分成数字型、字符串型、变量型、域及数组元素
设置输入域到变量名 :
awk '{name=$1;six=$3; if (six=="man") print name " is " six}' temp
域值比较操作 :
awk 'BEGIN {BASE="27"} {if ($4<BASE) print $0}' temp
修改数值域取值 :( 原输入文件不会被改变 )
awk '{if ($1=="asima") $6=$6-1;print $1 $6 $7}' temp
修改文本域 :
awk '{if ($1=="asima) ($1=="desc");print $1}' temp
只显示修改记录 :( 只显示所需要的 区别上一条命令 注意 {})
awk '{if ($1=="asima) {$1=="desc";print$1}}' temp
创建新的输出域 :
awk '{$4=$3-$2; print $4}' temp
统计列值 :
awk '(tot+=$3);END {print tot}' temp  会显示每列的内容
awk '{(tot+=$3)};END {print tot}' temp  只显示最后的结果
文件长度相加 :
ls -l|awk '/^[^d]/ {print $9"\t"$5} {tot+=$5} END{print "totKB:" tot}'
只列出文件名 :
ls -l|awk '{print $9}'  常规情况文件名是第 9
2.6.awk内置字符串函数:
gsub(r s)  在整个 $0 中用 s 替代 r
awk 'gsub(/name/ "xingming") {print $0}' temp
gsub(r s t)  在整个 t 中用 s 替代 r
index(s t)  返回 s 中字符串 t 的第一位置
awk 'BEGIN {print index("Sunny" "ny")}' temp  返回 4
length(s)  返回 s 的长度
match(s r)  测试 s 是否包含匹配 r 的字符串
awk '$1=="J.Lulu" {print match($1 "u")}' temp  返回 4
split(s a fs)  fs 上将 s 分成序列 a
awk 'BEGIN {print split("12#345#6789" myarray "#")"'
返回 3 ,同时 myarray[1]="12"  myarray[2]="345"  myarray[3]="6789"
sprint(fmt exp)  返回经 fmt 格式化后的 exp
sub(r s)  $0 中最左边最长的子串中用 s 代替 r( 只更换第一遇到的匹配字符串 )
substr(s p)  返回字符串 s 中从 p 开始的后缀部分
substr(s p n)  返回字符串 s 中从 p 开始长度为 n 的后缀部分
2.7.printf函数的使用:
字符转换 : echo "65" |awk '{printf "%c\n" $0}'  输出 A
awk 'BEGIN {printf "%f\n" 999}'  输出 999.000000
格式化输出 :awk '{printf "%-15s %s\n" $1 $3}' temp 将第一个域全部左对齐显示
2.8.其他awk用法:
向一行 awk 命令传值 :
awk '{if ($5<AGE) print $0}' AGE=10 temp
who | awk '{if ($1==user) print $1 " are in " $2 ' user=$LOGNAME  使用环境变量
awk 脚本命令 :
开头使用  !/bin/awk -f  ,如果没有这句话自含脚本将不能执行,例子 :
!/bin/awk-f
# all comment lines must start with a hash '#'
# name: student_tot.awk
# to call: student_tot.awk grade.txt
# prints total and average of club student points
# print a header first
BEGIN
{
print "Student Date Member No. Grade Age Points Max"
print "Name Joined Gained Point Available"
print"========================================================="
}
# let's add the scores of points gained
(tot+=$6);
# finished processing now let's print the total and average point
END
{
print "Club student total points :" tot
print "Average Club Student points :" tot/N
}
2.9.awk数组:
awk 的循环基本结构
For (element in array) print array[element]
awk 'BEGIN {record="123#456#789";split(record myarray "#")}
END { for (i in myarray) {print myarray[i]} }




本文转自 vfast_chenxy 51CTO博客,原文链接:http://blog.51cto.com/chenxy/813933,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
Perl
awk命令中逐行处理
awk命令中逐行处理
44 3
|
9月前
|
机器学习/深度学习 存储 监控
sed命令(超详细)
是一种流编辑器,它是文本处理中非常好的工具,能够完美的配合正则表达式使用,功能不同凡响。 处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命 令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复, 直到文件末尾。
151 0
|
11月前
|
Unix Shell Linux
【Shell编程】字符截取命令awk、sed命令
【Shell编程】字符截取命令awk、sed命令
165 0
|
11月前
|
Perl
sed(按行操作)文本过滤
sed(按行操作)文本过滤
|
Perl
awk指定分隔符
awk指定分隔符
53 0
|
数据安全/隐私保护 Perl
文本三剑客之awk命令(下)
1 awk概述 awk的工作原理: 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。 awk倾向于将一行分成多个"字段"然后再进行处理。 awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。 使用awk命令的过程中,可以使用逻辑操作符"&&"表示"与"、"|"表示"或"、"!"表示"非",还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
120 0
|
Linux Perl
awk命令 去掉重复行
linux awk命令 去掉重复行 1.打印指定列 域信息
340 0
|
MySQL 关系型数据库 Perl