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,"	文件大小:"$5,"	文件:"$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语句}'
作者:iveBoy
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/shenjianping/p/14392140.html