awk命令

awk的 作用是对文本和数据进行扫描与处理

awk指令的一些参数说明:

-F (field-separator fs)  指定以 fs 作为输入行的分隔符(默认分隔符为空格或制表符)

-v var=val    在执行处理过程以前,设置一个变量 var 值为 val

-f program-file  从脚本文件中读取 AWK 指令,以取代在命令参数中输入处理脚本

-W dump-variables[=file]  打印全局变量(变量名、类型、值)到文件中,如果没有提供文件名,则自动输出至名为 dump-variables 的文件中

一个 awk 程序包含一系列的 模式 {动作指令} 或是函数定义
模式可以是:

BEGIN
END
表达式
表达式,表达式
动作指令需要以{}引起来

简单示例

test.txt文件内容

a

b


c

d
awk '/^$/ {print "Blank line"}' test.txt
备注: /^$/通过正则表达式匹配空白行,动作为打印 Blank line;即 test.txt 如有 N 个空白行, awk 将在屏幕打印 N 个 Blank line。


awk '/HOSTNAME/' /etc/sysconfig/network
备注: 打印包含主机名的行,因为没有指定动作指令,默认动作为打印


脚本awk.sh的内容是:/^$/ {print "Blank line"}
awk -f awk.sh test.sh
备注:提前编辑一个 awk 脚本再通过-f 选项调用该脚本

awk 基本操作

  • 记录与字段

awk 一次从文件中读取一条记录,并将记录存储在字段变量$0 中。记录被分割为字段并存储在$1,$2 ..., $NF 中(默认使用空格或制表符为分隔符)。

内建变量 NF 为记录的字段个数

echo hello the world | awk '{print $1,$2,$3}'
备注:读取输入行并输出第一个字段,第二个字段,第三个字段


echo hello the world | awk '{print $0}'
备注:读取输入行并输出该行


echo hello the world | awk '{print NF}'
备注:读取输入行并输出该行的字段个数: 3 个字段


echo hello the world | awk '{print $NF}'
备注:读取输入行并输出该行的第三个字段,因为 NF 为 3,所以$NF 等同于取行的最后一个字段
  • 字段分隔符

默认 awk 读取数据以空格或制表符作为分隔符,但可以通过-F 或 FS(field separator)变量> 来改变分隔符

awk -F: '{print $1}' /etc/passwd
awk 'BEGIN {FS=":"} {print $1}' /etc/passwd
备注:以上两个示例均将字段的分隔符改冒号(:),即以冒号为分隔符打印 passwd文件的第一个字段(帐号名称)


echo 'hello the:world!' | awk 'BEGIN {FS="[:, ]"} {print $1,$2,$3}'
备注:指定多个字段分隔符(文档内容为: hello the:word,!)
  • 内置变量
变量名 说明
ARGC 命令行参数个数
FILENAME 当前输入文档的名称
FNR 当前输入文档的当前记录编号,尤其当有多个输入文档时有用
NR 输入流的当前记录编号
NF 当前记录的字段个数
FS 字段分隔符
OFS 输出字段分隔符,默认为空格
ORS 输出记录分隔符,默认为换行符\n
RS 输入记录分隔符,默认为换行符\n

test1.txt文件内容

This is a test file.
Welcome to Jacob's Class.

test2.txt文件内容

Hello the world.
Wow! I'm overwhelmed.
Ask for more.

test3.txt文件内容

mail from: tomcat@gmail.com
subject:hello
data:2012-07-12 17:00
content:Hello, The world.

mail from: jerry@gmail.com
subject:congregation
data:2012-07-12 08:31
content:Congregation to you.

mail from: jacob@gmail.com
subject:Test
data:2012-07-12 10:20
content:This is a test mail.

示例

awk '{print FNR}' test1.txt test2.txt
输出当前文档的当前行编号,第一个文件两行,第二个文件三行


awk '{print NR}' test1.txt test2.txt
备注: awk 将两个文档作为一个整体的输入流,通过 NR 输入当前行编号


awk '{print NF}' test1.txt
备注: test1.txt 文档的第一行有 5 个字段,第二行有 4 个字段


awk '{print $1,$2,$3}' test1.txt
默认 print 输出时,各参数将的输出分隔符默认为空格,所以输出内容如下


awk 'BEGIN {OFS="-"} {print $1,$2,$3}' test1.txt
备注:通过 OFS 将输出分隔符设置为"-",这个 print 在输出第一、二、三个字段时,中间的分隔符为"-"


awk 'BEGIN {FS="\n";RS=""}  {print $3}' test3.txt
读取输入数据,以空白行为记录分隔符,即第一个空白行前的内容为第一个记录,第一个记录中字段分隔符为换行符
以上 awk 的效果为打印所有的邮件时间,即每个记录的第三个字段
  • 表达式与操作符

表达式是由变量、常量、函数、正则表达式、操作符组成, awk 中变量有字符变量和数字变量。如果在 awk 中定义的变量没有初始化,则初始值为空字串或 0。
注意:字符操作时一定记得需要加引号

操作符 含义
~ 匹配
!~ 不匹配

注:另外的一些操作符与 C 语言类似

echo 'test' | awk 'x=2 {print x+3}'
echo 'test' | awk 'BEGIN {OFS="\n"} x=2,y=3 {print x*2,y*3}'


awk '/^$/  {print x+=1}' test.txt
备注:统计所有空白行

awk '/^$/ {x+=1} END {print x}' test.sh
备注:打印总空白行个数

awk -F: '$1~/root/ {print $3}' /etc/passwd
备注:打印 root 的 ID号, $1~root:第一个字段要匹配root


awk -F: '$3>500 {print $1}' /etc/passwd
备注:列出计算机中
ID 号大于 500 的用户名

awk 条件及循环语句

df | grep "boot" | awk '{if($4<2000)print "Alart";else print "ok"}'
备注:判断 boot 分区可用容量小于 20M 时报警,否则显示 OK
 
 
awk 'i=1 {} BEGIN {while (i<=10){++i;print i}}' test.txt
awk 'BEGIN {do {++x;print x} while (x<=10)}' test.txt
awk 'BEGIN {for(i=1;i<=10;i++)print i}' test.txt

函数

  • rand () 产生 0-1 之间的浮动类型的随机数
awk 'BEGIN {print rand();srand(); print srand()}' test.txt
  • gsub(x,y,z) 在字串 z 中使用字串 y 替换与正则表达式 x 相匹配的所有字串, z 默认为$0
awk -F: 'gsub(/root/, "jacob", $0) {print $0}' /etc/passwd
备注:将 passwd 每行中所有的 root 修改为 jacob 显示至屏幕
  • sub(x,y,z) 在字串 z 中使用字串 y 替换与正则表达式 x 相匹配的第一个字串, z 默认为$0
awk -F: 'sub(/root/,"jacob",$0) {print $0}' /etc/passwd
备注:将 passwd 每行中第一个 root 修改为 jacob 显示至屏幕
sub 相当于 sed 中的 s///, gsub 相当于 sed 中的 s///g。
  • length(z) 返回字串 z 的长度
awk '{print length()}' test.txt
显示 test.txt 文档每行的字符长度
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • awk命令的基本使用 [root@shellscript ~]# head -n 3 /etc/passwd | ...
    古寒飞阅读 1,062评论 0 2
  • 参考linux之awk用法 awk是一个非常棒的数字处理工具。相比于sed常常作用于一整行的处理,awk则比较倾向...
    Shirley_奋进中的虾米阅读 678评论 0 0
  • linux awk命令详解 来源:ggjucheng 链接:http://www.cnblogs.com/ggju...
    meng_philip123阅读 857评论 0 1
  • 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤...
    ad085d162310阅读 1,119评论 0 1
  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,196评论 2 25