shell-awk 学习笔记

shell-awk文本分析工具

awk的处理文本和数据的方式:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

程序结构 模式-动作

模式:包含三部分:起始部分、常规部分、结尾部分。每个模式部分都可以使用相应的代码指令,在{}中使用代码指令。

BEGIN {a=1}
开始,用于初始化变量,只执行一次 BEGIN是AWK的关键字,可选的

{ }
BODY语句块部分,对输入的每一行执行

END { }
结尾,可选的,对文件都执行之后进行剩下的操作

使用方式三种

可以直接在命令行中执行AWK的命令,也可以从包含AWK命令的文本文件中执行。

命令行方式

awk '' file..    

’ '中为awk代码 地址可以是相对位置或结对位置

$ awk 'BEGIN{printf "name\tage\n"} {print}' age.txt  
\\相对位置或结对位置,每一行的内容打印
\\一行数据中默认以**空格**或**TAB**分开的称为列(域),列(域)从1开始,0表示整体内容即当前行  $0当前行

out:
name age
小王 11
小李 12
小张 13


$0当前行 程序每行都执行完后$0保存的数值为最后一行,可以用它得到最后一行数

$ cat age.txt | awk 'END{print $0}'

out:
song 13


文件方式

$ awk -f print.awk age.txt         -f 从文件读取awk命令

out:
小王 11
小李 12
小张 13


* 管道方式,通过管道获得输入

$ cat filename | awk '{print}'

awk说明

awk --help  -h     查看帮助     

awk -p 将执行代码格式化保存到文件,默认文件为awkprof.out

$ awk -p./AWK 'BEGIN{print "name"}'

out:
name


awk -v 添加变量

$ awk -v name=Mak 'BEGIN{print name}'

out:
Mak


aw内置变量  NR行符 NF列的个数 FN行分隔符,默认空格或Tab

-F 内容分隔符  -F "_"  默认为空格
$ cat age.txt | awk -F _ '{print$1}'  如果该行没有该分隔符分隔,则为一个整字符串

out:
小王 11
小李 12
小张 13
shioafe


$ cat age.txt | awk -F'小' '{print$2;} END{print FS}'

out:
王 11
李 12
张 13


$ date | awk -F " |年|月|日|:" '{print $1}'   
按照正则表达式的方法。用|表示或,两个如果是挨着的则中间的列存在且是空

out:
2018


AWK中内置变量FS也是分隔符
$ date +%x | awk 'BEGIN{FS = "/"}{print$1}'

out:
2018


将打印信息存放的文件   >  >>   结对位置,且路径存在 
> 如果文件存在则覆盖文件
>> 如果文件存在则将输出内容添加到文件现有内容之后

awk 'BEGIN{printf "name\tage\n"} {print}' age.txt > file.

通过条件打印内容
行中包含‘2’的 第一列

$ cat age.txt | awk '/2/ {print $1}'
$ cat age.txt | awk '/2/'    没有程序体,默认打印

使用awk程序进行统计行数

$ cat age.txt | awk '/2/ {++n} END{print "len=",n}'

关于打印输出

print 自动换行,但不能格式化输出,及不能使用%d,%s,%c 等
printf  格式化输出,但不会自动换行

操作符

与其它编程语言一样(c语言类似),awk也提供了大量的操作符。
算术运算符、增减运算符、赋值运算符、关系运算符、逻辑运算符、三目运算符?:

字符串--->用双引号""

字符串连接符(数值型也可按字符串连接)   空格

数值型

a = 10;b = 11b;
print b; 
11
//开头为数值,转为数值
//前面为其他字符则不正确   a = a10;

浮点型同理

 a = 10.1;b = a a;
 print b;
 10.110.1
  print b+1
  11.11  
  //将下一个小数点及之后整体去除,剩下的进行运算

域内正则表达式使用~ 和!~ 表示匹配和不匹配 或者反斜杠/…/
awk使用正则表达式不是以一条字符串的方式 而是以的方式进行

$ cat age.txt | awk '$0 ~ 2'

out:
小李 12


$ cat age.txt | awk '$0 !~ 2'

out:
小王 11
小张 13


匹配正则表达式需要在表达式前后添加反斜线

echo -e "cat\nbat\nfun\nfin\nfan" | awk '/f.n/'   
-e 开启转义  /f.n/ 按先后顺序先匹配f,找到后找.(.表示任意单个字符),然后是n

使用正则的一些例子

$ echo -e "cat\nbat\nfun\nfin\nfan" | awk '/f.n/'   

out:
fun
fin
fan


$ echo -e "This\nThat\nThere\nTheir\nthese" | awk '/^The/'     
字符串前^ 表示开头,有大小写区分

out:
There
Their


$ echo -e "knife\nknow\nfun\nfin\nfan\nnine" | awk '/n$/'   
字符后$,表示结尾

out:
fun
fin
fan


$ echo -e "Call\nTall\nBall" | awk '/[CT]all/'   
数组中的每个字符出现的情况 用或表示

out:
Call
Tall


$ echo -e "Call\nTall\nBall" | awk '/[^CT]all/'   
^在列表中则表示为负,及不是以C或T开头的,后面为all的字符串

out:
Ball


$ echo -e "Call\nTall\nBall\nSmall\nShall" | awk '/Call|Ball/'   
在正则表达式中 |表示或

out:
Call
Ball


$ echo -e "Colour\nColor" | awk '/Colou?r/'          
u? u出现0次或1次的相应匹配   ?表示{0,1}

out:
Colour
Color


$ echo -e "c\nca\ncat\ncatt" | awk '/cat*/'   
以ca 之后的所有字符串,可以理解为t出现的{0,n}次,等价^ca

out:
ca
cat
catt


$ echo -e "ca\ncat\ncatt\ncabbd" | awk '/cat*/'         

out:
ca
cat
catt
cabbd


$ cat age.txt | awk '/11/,/13/'   11开始,到13的第一次出现为止。

out:
小王 11
小李 12s
小丽 11
小张 13


$ echo -e "Cbball\nTall\nBall\nTabbll" | awk '/Ta*ll/'   
当*放到中间,则只是表示为a出现的情况,等价于/^Ta{0,}11$/  a等价于a{0,}

out:
Tall


$ echo -e "111\n22\n123\n234\n456\n222"  | awk '/2+/'  
至少出现一次2的字符串

out:
22
123
234
222


多条件匹配 可以使用括号和逻辑操作符与 && , 或 || , 以及非 ! 对模式进行组合。
$ cat age.txt | awk '/^s/ && /3$/'

out:
song 13


通过管道方式排序 | sort
$ cat age.txt | awk '{print $2,$1}' | sort

out:
11 小丽
11 小王
12s 小李
13 song
13 小张
13ll qian
13n zhao


控制语句 if(条件){语句}   if(条件){语句}else{语句}
循环语句 
for()
while(条件){语句}
do{语句} while(条件)

案例

xml查找
ls | awk '/20180215/ {print}'
ls -l | awk '{ if(20==$7) print$9}'

$ cat age.txt | awk '{t=t $1} END{print t}'

小王小李小丽小张shioafe_sadfd_sdfzhaoqiansong

你可能感兴趣的:(shell,linux)