shell语句记录-awk

 cat ./daily_uv/daily_uv_20140104 | awk '{fr[$1]+=$3; k=$1 "_" $2; av[k]+=$3;} END{for (k in fr) {print k,fr[k]} for (k in av) {print k,av[k]}}' 

1.  最基本的用法

awk '{print $1}' ./daily_messageEnter_uv/daily_messageEnter_uv_20131226

即 awk '{*****}' filename

2.  awk的格式化输出,和C语言的printf没什么两样

如awk '{printf "%s %s", $1,$2}' ./filename

注意!!!

此时输出的效果与awk '{print $1}' 不同,1中的print会自动换行,但这里的printf如果不指定的话是连着输出的,输出方式:输出第一列的第一行,第二列的第一行,然后是第一列的第二行,第二列的第二行 ………………

如果希望换行,那么:加上

即awk '{printf "%s %s ", $1,$2}' ./filename

也可以加上 等

3.  过滤记录

awk '$1=="android" && $3>=10000 ' filename
输出  android 3.4.3 82256 65735
    android 3.2.1 10503 8540
    android 3.3.0 82071 66686
    android 3.4.0 18517 15031

此时四列满足条件的数据都将被输出(默认情况)

如果需要输出指定的数据需要使用前面提到的输出方法。

$ awk '$1=="android" && $3>=10000 {print $1,$2}  '  filename

此时可以总结这样的规律:awk的语句是写在'***' 中的,{**}中写输出的内容,语句中间没有符号,顺着向后写即可

注意!!!!

$1=="android" 这里的字符串需要用双引号

  3.1  输出行号

  awk '$1=="android" && $3>=10000 {print NR,$1,$2}’ filename

4.  指定分隔符

 awk -F ’;‘ '{print NR,$1,$2}‘

-F可以指定分隔符,默认是Tab或是空格

  4.1  内建变量

  awk的一些内建变量:

$0 当前记录(这个变量中存放着整个行的内容)
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符 默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 输入的记录分隔符, 默认为换行符
OFS 输出字段分隔符, 默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字

如果是多个分隔符可以写成

awk -F '[,;]'

指定输出分隔符 awk -F OFS=" " '{print $1}'   filename

5.  字符串匹配

awk '$1 ~ /an.*|ipad/ {print $0}'    filename

‘|’符号的左右不要随意添加空格

awk '$1 ~ /an.*|ipad/ || NR==1 {print $0}'    filename

即输出表头

awk可以像grep一样的去匹配第一行,就像这样:

awk '/ipad/' filename

模式取反的例子:

awk '$1 !~ /an.*|ipad/ {print $0}'  filename


原文地址:https://www.cnblogs.com/lingNote/p/3507836.html