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 --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