天天看点

[Linux] awk命令详解

awk用于格式化报文或者从文件中抽取数据包.

1.$awk '{print $0}' gefforey.txt | tee gefforey.doc

该命令将在屏幕输出gefforey.txt文件内容并将其内容复制到gefforey.doc文件中.

2.$awk -F: '{print $1}' gefforey.log

该命令以:为单位读取gefforey.log文件中第一列内容.

3.$awk 'BEGIN {print "Name   Belt\n------------"} {print $1"\t"$3}' gefforey.txt

该 命令将在屏幕首先输出"Name   Belt",第二行输出"------------",并在输出文件内容的时候,每列之间间隔一个TAB位.可以在print语句之后加上END {print "end of output"},那么将会在文件内容输出结束的时候打印"end of output".

       4.$awk '$2 ~ /^baidu$/ {print $0}' gefforey.txt

该命令显示gefforey.txt文件中以空格分隔的第二列字符串是"baidu"的所有行.

5.$awk '{if($2 ~ /^baidu$/) print $0}' gefforey.txt

该命令判断如果某行第二列字符串为"baidu",则打印出该行.

       6.$awk '{if($2 < $3) print $0}' gefforey.txt

该命令显示判断如果某行第二列值小于第三列值,则打印该行.awk的条件操作符有:

< 小于,> = 大于等于,< = 小于等于,~ 匹配正则表达式,= = 等于,!~ 不匹配正则表达式,!= 不等于

7.$awk '{if($2 =="google1" && $3=="google2") print $0}' gefforey.txt

该命令判断如果某行第二列值为"google1"并且第三列值为"google2",则打印出该行.awk的逻辑表达式有:&& AND,|| O R,! 非.

8.$awk '{print NF,NR,$0} END{print FILENAME}' gefforey.txt

该命令会输出浏览记录的域个数和已读的记录数,并在输出结尾打印文件名.awk内置的变量有:

A R G C 命令行参数个数

A R G V 命令行参数排列

E N V I R O N 支持队列中系统环境变量的使用

FILENAME a w k浏览的文件名

F N R 浏览文件的记录数

F S 设置输入域分隔符,等价于命令行- F选项

N F 浏览记录的域个数

N R 已读的记录数

O F S 输出域分隔符

O R S 输出记录分隔符

R S 控制记录分隔符

(附:1.N F的一个强大功能是将变量$ P W D的返回值传入a w k并显示其目录。这里需要指定域分隔

符/.命令为:echo $PWD | awk -F/ '{print $NF}';

           2.显示文件名,命令为:echo "/usr/local/etc/rc.sybase" | awk -F/ '{print $NF}'.

9.$awk '{name=$1; belt=$3;if(belt ~ /yellow/) print name "is belt" belt }' gefforey.txt

该命令将第一列的值赋给变量name,第三行的值赋给变量belt,并打印语句.awk允许在语句中进行赋值操作,赋值操作符有:=, +=, *=, / =, %=, ^ = .

10.$awk 'gsub(/111/,222) {print $0}' gefforey.txt

该命令将文件中所有包含111的数字替换为222,awk的内置函数有:

g s u b ( r, s ) 在整个$ 0中用s替代r

g s u b ( r, s , t ) 在整个t中用s替代r

i n d e x ( s , t ) 返回s中字符串t的第一位置

l e n g t h ( s ) 返回s长度

m a t c h ( s , r ) 测试s是否包含匹配r的字符串

s p l i t ( s , a , f s ) 在f s上将s分成序列a

s p r i n t ( f m t , e x p ) 返回经f m t格式化后的e x p

s u b ( r, s ) 用$ 0中最左边最长的子串代替s

s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分

s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分

g s u b函数有点类似于s e d查找和替换。它允许替换一个字符串或字符为另一个字符串或字

符,并以正则表达式的形式执行。第一个函数作用于记录$ 0,第二个g s u b函数允许指定目标,

然而,如果未指定目标,缺省为$ 0。

i n d e x(s,t)函数返回目标字符串s中查询字符串t的首位置。l e n g t h函数返回字符串s字符

长度。m a t c h函数测试字符串s是否包含一个正则表达式r定义的匹配。s p l i t使用域分隔符f s将

字符串s划分为指定序列a。s p r i n t函数类似于p r i n t f函数(以后涉及),返回基本输出格式f m t的

结果字符串e x p。s u b(r,s)函数将用s替代$ 0中最左边最长的子串,该子串被( r)匹配。

s u b(s,p)返回字符串s在位置p后的后缀。s u b s t r(s,p,n)同上,并指定子串长度为n。

11.$echo "65" | awk '{printf "//%c\n",$0}'

该命令管道输出65到awk,并观察其ASCII字符.awk的printf函数格式如下:

% c A S C I I字符

% d 整数

% e 浮点数,科学记数法

% f 浮点数,例如(1 2 3 . 4 4)

% g a w k决定使用哪种浮点数转换e或者f

% o 八进制数

% s 字符串

% x 十六进制数

awk命令也许是linux系统中最为复杂的命令,需要好好的练习!

本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/3748462.html如需转载请自行联系原作者

demoblog