一,awk概述
awk 处理机制 :awk 会逐行处理文本 , 支持在处理第一行之前做一些准备工作 , 以及在处理完最后一行做一些总结性质的工作
在命令格式上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令快
END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果
比较经常用到的三种格式分别是:
# awk 'pattern' filename
# awk '{action}' filename
# awk 'pattern {action}' filename
二,awk基本用法
awk [-F|-f] 'BEGIN{}{command1; command2} END{}' file
[-F|-f] 大参数,-F指定分隔符,-f调用脚本
' ' 引用代码块
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
awk是一款很强大的文本处理工具,他把所要处理的字符串 按行 读入到内存进行分段处理。默认情况下是以空格或者tab作为分隔符,对每个分段都分配一个名字,第1部分用$1表示,第2部分用$2表示以此类推,整行内容用$0表示,另外变量NF
表示当前行有多少个字段,因此$NF
就代表最后一个字段具体如下:
Have | a | nice | day |
$1 | $2 | $3 $(NF-1) | $4 $(NF) |
awk其他的内置变量:
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
如果想对哪部分进行操作的话,直接用$n(n是数字)指定就可以了,这里的的操作一般是指print (自动换行)。printf则不会自动换行。
awk的基本语法:awk ‘{print $n}’
如果想打印第1部分和第3部分,可以用逗号隔开:
这里用逗号隔开的话,显示的结果是空格进行连接,如果不用逗号的话,结果是连在一起的:
或者 echo 'have a nice day' | awk '{print $1 $2}' 输出 havea
另外如果用双引号
echo 'have a nice day' | awk "{print $1 $2}" 输出 have a nice day
awk -F"[01]" '{}' 这种形式指定的分隔符是或的关系,即0或1作为分隔符;
awk -F"[0][1]" '{}' 这种形式指定的分隔符是合并的关系,即以“01”作为一个字符为分隔符。
echo "my -name is,-dai " | awk -F'[,-]' '{print $1}' my
echo "my -name is,-dai " | awk -F'[,-]' '{print $2}' name is
echo "my -name is,-dai " | awk -F'[,-]' '{print $3}' 输出为空
echo "my -name is,-dai " | awk -F'[,-]' '{print $4}' dai
另外如果想同时以空格 或者-或者逗号作为分隔符呢?还可以这样写:
分隔符空格不能出现在[]里,注意上面的写法
awk '{print NR ") " $0}' demo.txt
1) aaa 1 root 11111
2) bbb 2 ro2t 222 ddd aaa
3) ccc 3 xxxx r22t dddd
4) ddd 4 yyy root 222
5) eee 5 aaa zzz