Linux三剑客之awk命令
作者:互联网
awk是一种模式扫描和处理语言,它是功能非常强大的文档编辑工具,它不仅可以以行为单位,还能以列为单位进行文件处理。下面以以下三个方面来学习它:
- 格式详解
- 简单实践
- 进阶实践
一、格式详解
1、命令格式
- awk [参数] '[动作]' [文件名]
2、常用参数
- -F 指定列的分隔符
- -f 调用脚本
- -v 定义变量
3、常用动作
动作有三部分组成,分别是:
- BEGIN(命令) 初始代码块,主要和命令相关
- /pattern/(命令)匹配,执行代码块
- END(命令)结束代码块,主要和信息输出相关
常用的动作有print (显示内容):
- $0 显示当前行所有内容
- $n 显示当前行的第n列内容,如果有多列,中间以逗号隔开
4、内置变量
当然该命令还可以使用如下的一些内置变量:
- FILENAME 只读变量,当前输入文件的文件名
- NR 指定显示行的行号
- NF 输出最后一列的内容
- OFS 指定输出列的分隔符,缺省是空格
- FS 输入文件的列的分隔符,缺省是空格和tab
二、简单实践
1、内容查看
# 文件内容 [root@localhost thrid_dir]# cat awk.txt aa AA AA1 aa BB BB1 cc CC CC1 # 查看文件全部列'{print}'相当于'{print $0}' [root@localhost thrid_dir]# awk '{print}' awk.txt aa AA AA1 aa BB BB1 cc CC CC1 # 查看第一列内容 [root@localhost thrid_dir]# awk '{print $1}' awk.txt aa aa cc # 查看第1,3列内容 [root@localhost thrid_dir]# awk '{print $1,$3}' awk.txt aa AA1 aa BB1 cc CC1 # 查看第1,3列内容 [root@localhost thrid_dir]# awk '{print $1$3}' awk.txt aaAA1 aaBB1 ccCC1 # 查看行号,1,3列内容 [root@localhost thrid_dir]# awk '{print NR,$1,$3}' awk.txt 1 aa AA1 2 aa BB1 3 cc CC1 # 查看正则内容 [root@localhost thrid_dir]# awk '/aa/' awk.txt aa AA AA1 aa BB BB1
2、参数实战
- -F
awk默认指定的列分隔符是空格,如果对于/etc/password文件就不能取出对应的列,因为中间是以':'分隔,所以需要指定分隔符。
[root@localhost thrid_dir]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown ... [root@localhost thrid_dir]# awk -F ':' '{print $1}' /etc/passwd root bin daemon adm lp sync shutdown ...
- -f
编写脚本,进行格式化。
# 编写format格式文件 [root@localhost thrid_dir]# cat format /aa/{print "第" NR "行:" "内容:" $0} # 加载格式文件 [root@localhost thrid_dir]# awk -f format awk.txt 第1行:内容:aa AA AA1 第2行:内容:aa BB BB1
- -v
# 传入单值 [root@localhost thrid_dir]# echo | awk -v var=10 '{print var}' 10 # 传入多值 [root@localhost thrid_dir]# echo | awk '{print v1,v2}' v1=100 v2=200 100 200
3、动作实战
动作是由三部分组成的,下面说明一下BEGIN和END是如何简单使用的,比如格式化输出:
# 文件内容 [root@localhost thrid_dir]# cat awk.txt aa AA AA1 aa BB BB1 cc CC CC1 # 指定分隔符输出 [root@localhost thrid_dir]# awk 'BEGIN{OFS=":"}{print NR,$1,$2}' awk.txt 1:aa:AA 2:aa:BB 3:cc:CC # 指定样式输出 [root@localhost thrid_dir]# awk 'BEGIN{print "--开始输出--"}{print NR,$1,$2}END{print "--结束输出--"}' awk.txt --开始输出-- 1 aa AA 2 aa BB 3 cc CC --结束输出--
三、进阶实战
1、fi语句
输出/etc目录中大于500字节的普通文件:
- 过滤出字节大于500
- 普通文件
[root@localhost etc]# ll /etc/ | awk '{if (($5>500 && /^-/)) print "文件类型:" $1,"\t文件大小:"$5,"\t文件:"$9}' 文件类型:-rw-r--r--. 文件大小:1518 文件:aliases 文件类型:-rw-r--r--. 文件大小:12288 文件:aliases.db 文件类型:-rw-------. 文件大小:541 文件:anacrontab 文件类型:-rw-r--r--. 文件大小:2853 文件:bashrc 文件类型:-rw-r--r--. 文件大小:1165 文件:chrony.conf 文件类型:-rw-r--r--. 文件大小:1620 文件:csh.cshrc 文件类型:-rw-r--r--. 文件大小:841 文件:csh.login 文件类型:-rw-r--r--. 文件大小:5090 文件:DIR_COLORS ...
awk中的if语句格式:
- awk 参数 '{if语句 print语句}'
2、for语句
[root@localhost ~]# echo 'abcdefgh'|awk -F '' '{for(i=1;i<=NF;i++) print $i}'a b c d e f g h
awk中的if语句格式:
- awk 参数 '{for语句 print语句}'
标签:aa,thrid,awk,Linux,print,root,localhost,三剑客 来源: https://www.cnblogs.com/shenjianping/p/14392140.html