Linux awk命令使用详解
Linux awk命令使用详解
简单介绍一下,awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大,这是我们玩linux的必备基本功,若要对其身世有更详尽的了解,自行搜索即可。对于工具的知识,笔者尽量将每个知识点的简要说明,并给出实例。
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
用法:
awk [options] 'scripts' file1,file2...
awk [options] 'pattern {action}' file1,file2...
options是awk的支持的选项,譬如-F -v等; scripts是其处理脚本,包含模式pattern和动作action(模式和动作的关系一般为,模式负责确定有效字段,动作负责对其处理)
一、print的简单使用
创建一个简单的测试文件如下:
- [root@mos download]# cat demo.txt
- Welcome to mos blog.
- This is a test file.
例:打印整行: $0
- [root@mos download]# awk '{print $0}' demo.txt
- Welcome to mos blog.
- This is a test file.
例:打印每行的最后一个字段: $NF
- [root@mos download]# awk '{print $NF}' demo.txt
- blog.
- file.
例:打印第二个字段: $2
- [root@mos download]# awk '{print $2}' demo.txt
- to
- is
例:打印每行的倒数第二个字段,并在其后打印OK
- [root@mos download]# awk '{print $(NF-1),"OK"}' demo.txt
- mos OK
- test OK
例:打印行号
- [root@mos download]# awk '{print NR,$0}' demo.txt
- 1 Welcome to mos blog.
- 2 This is a test file.
例:打印当前系统环境变量的某个特定值,譬如路径,下面俩输出一样
- [root@mos download]# awk '{print ENVIRON["USER"];}' demo.txt
- root
- root
- [root@mos download]# awk 'BEGIN{print ENVIRON["PATH"];}'
- /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- PS:后面的文件只是为了让print成功执行,BEGIN是执行前可以输出的数据,常用作写为报告标题和测试输出,其内容不能获得与文件修改操作有关的变量,后面会说到;
例:awk的默认分隔符为空格,而有些文本字以其他字符为分隔符,以下两例相同
- [root@mos download]# awk -F: {'print $1,$NF'} /etc/passwd|tail -1
- mos1 /bin/bash
- [root@mos download]# awk -v FS=: '{print $1,$NF}' /etc/passwd|head -1
- root /bin/bash
例:修改输出分隔符号,特殊字符需转义,如下几例:
- [root@mos download]# awk -v OFS=. '{print $1,$NF}' demo.txt
- Welcome.blog.
- This.file.
- [root@mos download]# awk -v OFS="~"'{print $1,$NF}' demo.txt
- Welcome~blog.
- This~file.
- [root@mos download]# awk -v OFS=\" '{print $1,$NF}' demo.txt
- Welcome"blog.
- This"file.
- [root@mos download]# awk -v OFS=9 '{print $1,$NF}' demo.txt
- Welcome9blog.
- This9file.
- [root@mos download]# awk -v OFS=XXXX '{print $1,$NF}' demo.txt
- WelcomeXXXXblog.
- ThisXXXXfile.
- PS: 若在print输出字段的之间不写逗号,则输出分隔符无效,输出的结果会直接连在一起
awk中有许多默认的变量,例如之前列出的:$1~$n、$0、FS、OFS等。下图为awk内置变量表:
- 属性 说明
- $0 当前记录(作为单个变量)
- $1~$n 当前记录的第n个字段,字段间由FS分隔
- FS 输入字段分隔符 默认是空格
- NF 当前记录中的字段个数,就是有多少列
- NR 已经读出的记录数,就是行号,从1开始
- RS 输入的记录他隔符默 认为换行符
- OFS 输出字段分隔符 默认也是空格
- ORS 输出的记录分隔符,默认为换行符
- ARGC 命令行参数个数
- ARGV 命令行参数数组
- FILENAME 当前输入文件的名字
- IGNORECASE 如果为真,则进行忽略大小写的匹配
- ARGIND 当前被处理文件的ARGV标志符
- CONVFMT 数字转换格式 %.6g
- ENVIRON UNIX环境变量
- ERRNO UNIX系统错误消息
- FIELDWIDTHS 输入字段宽度的空白分隔字符串
- FNR 当前记录数
- OFMT 数字的输出格式 %.6g
- RSTART 被匹配函数匹配的字符串首
- RLENGTH 被匹配函数匹配的字符串长度
- SUBSEP \034
- 声明一下:由于许多变量笔者亦不怎么常用,因此笔者此处未全部列出。
|
评论暂时关闭