常用内建变量
$0 当前记录(这个变量中存放着整个行的内容) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入字段分隔符 默认是空格或Tab NF 当前记录中的字段个数,就是有多少列 NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。 FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号 RS 输入的记录分隔符, 默认为换行符 OFS 输出字段分隔符, 默认也是空格 ORS 输出的记录分隔符,默认为换行符 FILENAME 当前输入文件的名字
用awk处理net.txt文件,规则:第1到10行中,第二列的值等于3,并格式化输出结果,顺带输出行号(NR,FNR都是行号)
[pikaqiu@bogon awk]$ awk 'NR>0&&NR<11&&$2==3{printf"%-4s%-4s%-8s%-6s%-10s\n",NR,FNR, $1,$2,$6}' net.txt 6 6 unix 3 CONNECTED 7 7 unix 3 CONNE:CTED 8 8 unix 3 CONNECTED 9 9 unix 3 CONNE:CTED 10 10 unix 3 CONNECTED
文件分割示例
#第五列的值只有DGRAM和STREAM两种且没有空白行
#第六列的值只有CONNECTED和CONNE:CTED两种,但该列中间有大量空白行,每个空白行都会被拆分为一个单独的文件,
#即使两个空白行是连续的,也会被拆分成两个文件
[pikaqiu@bogon awk]$ awk 'NR!=1{print > $5}' net.txt [pikaqiu@bogon awk]$ ls DGRAM net.txt STREAM test.txt [pikaqiu@bogon awk]$ awk 'NR!=1{print > $6}' net.txt [pikaqiu@bogon awk]$ ls 10977 1252 12651 15226 16884 17593 18628 21459 22610 24916 CONNECTED net.txt 11341 1254 12652 15981 16950 17703 19530 21933 23744 25757 CONNE:CTED STREAM 11933 12641 15221 16758 17336 18475 19964 22031 23761 25931 DGRAM test.txt
判断第6列的值,如果为CONNECTED,则放到1.txt文件中,如果为CONNE:CTEN则放到2.txt中,如果都不是则放到3.txt文件中;
[pikaqiu@bogon awk]$ awk 'NR!=1{if($6 ~ /CONNECTED/)print > "1.txt"; > else if($6 ~ /CONNE:CTED/)print > "2.txt"; > else print > "3.txt" }' net.txt
统计文件夹的大小,或该文件夹下某种类型文件的大小
[pikaqiu@bogon shell]$ ll | awk '{sum+=$5}END{print sum}' 634071 [pikaqiu@bogon shell]$ ll *.sh| awk '{sum+=$5}END{print sum}' 2106