目录
awk
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自于标准输入、一个或多个文件、或其他命令的输出。它支持用户自定义函数和动态正则表达式等功能,是linux/unix下的一个强大的编程工具。它在命令行中使用,但更多是作为脚本使用。awk有很多内建的功能,比如数组、函数等。
语法
bash
awk [选项] '脚本命令' 文件名
常用命令选项
- -F fs:指定以fs作为输入行的分隔符,awk命令默认分隔符为空格或制表符
- -v var=value:在执行处理过程之前,设置一个变量var,并给其设置初始值
- -f scriptfile:从脚本文件中读取awk命令,以取代直接在命令行中输入指令
awk的强大之处在于脚本命令,它由两部分组成,分别为匹配规则和执行命令,如下所示:
bash
'匹配规则{执行命令}'
这里的匹配规则,用来指定脚本命令中可以作用到文本内容中的具体行,可以使用字符串(比如/demo/,表示查看含有demo字符串的行)或正则表达式指定。
注:整个脚本命令是用单引号括起来,而其中的执行命令部分需要用大括号括起来
变量 | 描述 |
---|---|
FS | 输入字符分隔符,默认为空白字符 |
OFS | 输出字段分隔符,默认为空白字符 |
RS | 输入记录分隔符,指定输入时的换行符,原换行符仍有效 |
ORS | 输出记录分隔符,输出时用指定符号代替换行符 |
NF | 字符数量,共有多少个字段, N F 引用最后一列, NF引用最后一列, NF引用最后一列,(NF-1)引用倒数第二列 |
NR | 行号,后可跟多个文件,第二个文件行号则继续从第一个文件最后行号开始 |
FNR | 各文件分别计数,行号;后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始 |
FILENAME | 当前文件名 |
ARGC | 命令行参数的个数 |
ARGV | 数组,保存的是命令行所给定的各参数,查看参数 |
示例:
bash
# cat awkdemo
hello:world
linux:redhat:lalala:hahaha
along:love:you
#指定冒号为分隔符,输出每行第一个变量和第二个变量
# awk -v FS=":" '{print $1,$2}' awkdemo #FS指定输入分隔符
hello world
linux redhat
along love
#以冒号为分隔符,指定新的分隔符为"---",输出每行第一个变量和第二个变量
# awk -v FS=":" -v OFS="---" '{print $1,$2}' awkdemo #OFS指定输出分隔符
hello---world
linux---redhat
along---love
#指定冒号为输入记录分隔符,(不指定输出分隔符,默认为空格),输出每行第一个变量和第二个变量
# awk -v RS=":" '{print $1,$2}' awkdemo
hello
world linux
redhat
lalala
hahaha along
love
you
#指定冒号为输入字符分隔符,替换换行符为"---",输出每行第一个变量和第二个变量
# awk -v FS=":" -v ORS="---" '{print $1,$2}' awkdemo
hello world---linux redhat---along love---
#指定冒号为输入分隔符,输出每行的变量数量
# awk -F: '{print NF}' awkdemo
2
4
3
#指定冒号为输入分隔符,输出每行的倒数第二个变量
# awk -F: '{print $(NF-1)}' awkdemo
hello
lalala
love
自定义变量
1、先定义变量,后执行动作
bash
# cat awkdemo
hello:world
linux:redhat:lalala:hahaha
along:love:you
# awk -v name="along" -F: '{print name":"$0}' awkdemo
along:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:you
2、先执行动作,后定义变量
bash
# awk -F: '{print name":"$0;name="along"}' awkdemo
:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:you
3、调用脚本进行定义
bash
# cat awk.txt
{name="along";print name,$1}
# awk -F: -f awk.txt awkdemo
along hello
along linux
along along