awk 命令简介
awk 是一个强大的文本分析工具,相对于grep 的查找,sed的编辑,awk 在其对数据分析并生成报告时,显得非常强大,awk 其实是一门语言,”格式扫描和处理语言“,它允许您创建简短的程序,这些程序读取输入文件 ,为数据排序,处理数据,对输入执行计算以及生成报表等。
awk 命令格式
- 命令行方式
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
-
shell 脚本
-
akw文件
awk -f awk-script-file input-file(s)
awk 选项参数
参数 | 说明 |
---|---|
-F | 指定输入文本的分隔符,字符串或者是一个正则表达式 |
-v | 定义一个用户自定义变量 |
-f | 从指定的文件中读取 awk 命令 |
-W | 打印简短的版权信息 或 打印关于不能向伟统unix平台移植的结构 |
last 命令用于查询最后登录的5个用户及详情 -n 5 是取最后两个
如果我们只想取登录的用户,使用awk最简单:
last -n 5 | awk '{print $1}'
# 也可以取 1 ,3 列
last -n 5 | awk '{print $1,$3}'
# awk 命令中列是从1开始取的,所以 $0 代表的是这一行
last -n 5 | awk '{print $0}' # 和 last -n 5 输出相同
-F 的使用
这里使用的例子是var/log/yum.log
、文件中的内容,在我们平时,也有处理日志的需求,所以使用 awk
会更加的方便。
# 如果我们想要得到所有安装和更新的软件列表
cat yum.log | awk -F: '{print $4,$5}'
-F 可以使用任意字符充当分割符号
-v 的使用
创建测试文本:awk_test.txt
内容为:
可以使用 awk
对变量进行赋值,然后使用变量批量计算每一行的数据。
cat awk_test.txt | awk -v a=1 '{print $1 + a}'
结果和上面文件中的内容有一点差别,是因为最后一行其实是一个空行,但是在进行加法的时候,这一行也加上了1,但是不是按照数字的加减法的,是按照拼接。
awk 内建变量
变量 | 描述 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔 |
$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 一条记录的字段的数目 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出字段分隔符,默认值与输入字段分隔符一致。 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
内建变量的使用
awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 5 1
log.txt 2 2 5 2
log.txt 2 3 3 3
log.txt 2 4 4 4
awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 ' 1 1
log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
log.txt 2 4 ' 1 4
# 输出顺序号 NR, 匹配文本行号
awk '{print NR,FNR,$1,$2,$3}' log.txt
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $
awk 使用正则表达式
使用正则,字符串匹配
# 输出第二列包含 "th",并打印第二列与第四列
awk '$2 ~ /th/ {print $2,$4}' log.txt
this a
~ 表示模式开始。// 中是模式。
# 输出包含 "re" 的行
awk '/re/ ' log.txt
3 Are you like awk
10 There are orange,apple,mongo
忽略大小写
awk 'BEGIN{IGNORECASE=1} /this/' log.txt
2 this is a test
This's a test
模式取反
awk '$2 !~ /th/ {print $2,$4}' log.txt
Are like
a
There orange,apple,mongo
awk '!/th/ {print $2,$4}' log.txt
Are like
a
There orange,apple,mongo
细节决定成败!
个人愚见,如有不对,恳请扶正!