linux-awk常用命令

linux-awk常用命令

awk从放弃到入门

菜鸟教程

语法

awk [options] ‘Pattern{Action}’ file

常用参数

参数 作用
-F 指定输入文件的分隔符
-v 赋值一个用户变量
-f 从脚本文件中读取awk命令

准备2个文件:test1.txt,test2.txt

image-20210602155405215

打印全文

awk '{print}' test1.txt
awk '{print $0}' test1.txt
image-20210602160105709

指定分隔符:,并打印第一列。默认分割符是空格

awk '{print $1}' test1.txt
awk -F ':' '{print $1}' test1.txt
image-20210602162537464

同时指定冒号 : 和空格' '作为分割符,打印1,3列

awk -F ' |:' '{print $1,$3}' test1.txt
image-20210602163010460

变量

内置变量

awk 常用内置变量

变量 作用
FS 输入字段分隔符,默认为空白字符
OFS 输出字段分隔符,默认为空白字符
RS 输入行分割符,默认是回车换行
ORS 输出记录分割符(输入换行符),输出时用指定符号代替换行符
NF 当前行的字段的个数(即当前行被分割成了几列),字段数量
NR 行号,当前处理的文本行的行号。
FNR 各文件分别计数的行号
FILENAME 当前文件名
ARGC 命令行参数的个数
ARGV 数组,保存的是命令行所给定的各参数

NR,NF,FNR

NR 表示每一行的行号,NF 表示一行中共有几列。默认分隔符是空格

awk '{print NR,NF}' test1.txt
awk -F ' |:' '{print NR,NF}' test1.txt
image-20210602175625652

打印最后一列,不知道行号可以用 $NF 表示

awk '{print $NF}' test1.txt
image-20210602181349207

多个文件分别统计行号用 FNR

awk '{print NR,$0}' test1.txt test2.txt
awk '{print FNR,$0}' test1.txt test2.txt
image-20210602182108283

FILENAME 显示文件名

awk '{print FNR,$0}' test1.txt test2.txt
awk '{print FILENAME,FNR,$0}' test1.txt test2.txt
image-20210607163958127

ARGC 和 ARGV

ARGV 表示数组,在 awk 中 ARGV[0] 表示 awk,ARGC 表示参数个数

建 3.txt 和 4.txt 两个文件

image-20210607181540323

打印数组的话会根据后面文件里面的行数显示,如果文件里面什么都没有就没有输出

awk -F ':' '{print $1,ARGV[0],ARGV[1],ARGV[2],ARGC}' test1.txt test2.txt
awk -F ':' '{print $1,ARGV[0],ARGV[1],ARGV[2],ARGC}' test2.txt 3.txt
awk -F ':' '{print $1,ARGV[0],ARGV[1],ARGV[2],ARGC}' 3.txt 4.txt
image-20210607183431925
image-20210607183015177

自定义变量

用 -v 指定变量名或者在 program 中直接定义。

awk -v value="test1" 'BEGIN{print value}'
awk 'BEGIN{value="test1";print value}'
image-20210608093416527

格式化

格式替换符 作用
%s 字符串
%f 浮点格式(也就是我们概念中的 float 或者 double)
%b 相对应的参数中包含转义字符时,可以使用此替换符进行替换,对应的转义字符会被转义。
%c ASCII 字符。显示相对应参数的第一个字符
%d, %i 十进制整数
%% 表示 ”%” 本身
转义符 作用
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符

在 awk 中使用 printf 动作时的注意事项

1、使用 printf 动作输出的文本不会换行,如果需要换行,可以在对应的”格式替换符”后加入”\n” 进行转义。

2、使用 printf 动作时,”指定的格式” 与 “被格式化的文本” 之间,需要用 ”逗号” 隔开。

3、使用 printf 动作时,”格式” 中的 ”格式替换符” 必须与 “被格式化的文本” 一一对应。

image-20210608162347572
awk '{printf "第一列:%s 第二列:%s\n" , $1,$2}' test1.txt
image-20210609091114361

打印表头

awk 'BEGIN{printf "%s\t %s\n", "第一列","第二列"}{printf "%s\t %s\n",$1,$2}' test1.txt
image-20210609144748616

数字可以设置输出的宽度

awk 'BEGIN{printf "%5s\t %5s\n", "第一列","第二列"}{printf "%5s\t %5s\n",$1,$2}' test1.txt
image-20210609145345148

默认每一列靠右对齐,加 - 靠左对齐

awk 'BEGIN{printf "%-5s\t %-5s\n", "第一列","第二列"}{printf "%-5s\t %-5s\n",$1,$2}' test1.txt
image-20210609145441260

对于数字可以用 + 显示正数前面的加号,不是数字的话会被转换成 0

awk 'BEGIN{printf "%+5s\t %+5s\n", "第一列","第二列"}{printf "%-+5d\t %-+5d\n",$1,$2}' test1.txt
image-20210609150940899

模式

当 awk 进行逐行处理的时候,会把 pattern(模式)作为条件,判断将要被处理的行是否满足条件,是否能跟 ”模式” 进行匹配,如果匹配,则处理,如果不匹配,则不进行处理。

空模式

没指定任何模式即为空模式,空模式会匹配文本中的每一行,所以,每一行都会执行相应的动作。

匹配所有行并打印第一个字段

awk '{print $1}' test1.txt
image-20210610174034458

关系运算模式

关系运算符 含义
< 小于
<= 小于等于
== 等于
!= 不等于
>= 大于等于
> 大于
~ 与对应的正则匹配则为真
!~ 与对应的正则不匹配则为真

如果第一列的数字为 2,打印该行

awk '$1==2 {print $0}' test1.txt
awk '$1==2' test1.txt
image-20210615170911639

正则模式

打印以 A 开头的行

awk '/^A/ {print $0}' test1.txt
image-20210615171406045

与关系运算模式结合使用用 ~ 或者!~连接

打印第二列为字母的行

awk '$2~/[a-z]/ {print $0}' test1.txt
image-20210615171700080

打印第二列不为字母的行

awk '$2!~/[a-z]/ {print $0}' test1.txt
image-20210615171740392

行范围模式

打印第二列为 2 到 3 之间的行

awk '/2/,/3/' test1.txt
awk '/2/,/3/ {print $0}' test1.txt
image-20210615173620796

打印第二列为 2 到 a 之间的行

awk '/2/,/a/' test1.txt
awk '/2/,/a/ {print $0}' test1.txt
image-20210616151557880

BEGIN/END 模式

BEGIN 模式指定了处理文本之前需要执行的操作,END 模式指定了处理完所有行之后所需要执行的操作。

先打印 start,然后打印 test1 文件中的第一列,最后打印 end

awk 'BEGIN{print "start"} {print $1} END{print "end"}' test1.txt
image-20210616152126150

条件语句与循环

打印序列,并在第一列的下面打印第二列

awk '{print $1}{print $2}' test1.txt
awk '{print $1; print $2}' test1.txt
image-20210616153723895

条件语句

IF语句

如果行号为 1 ,打印该行

awk '{if(NR == 1){print $0}}' test1.txt
image-20210616155542361

IF-ELSE语句

如果行号小于等于 2 ,打印该行并在后面加上一列 "条件一",否则打印改行并在后面加上一列 "条件二"

awk '{if(NR<=2){print $0,"条件一"}else{print $0,"条件二"}}' test1.txt
awk '{if(NR<=2)print $0,"条件一";else print $0,"条件二"}' test1.txt
image-20210616162227383

IF-ELSE-IF语句

如果行号等于 1,打印该行并在后面加上一列 "第一行",如果行号等于 2 ,打印该行并在后面加上一列 "第二行",如果行号等于 3 ,打印该行并在后面加上一列 "第三行"

awk '{if(NR==1){print $0, "第一行"} else if(NR==2){print $0,"第二行"} else if(NR==3){print $0,"第三行"}}' test1.txt
awk '{if(NR==1)print $0, "第一行"; else if(NR==2)print $0,"第二行"; else if(NR==3)print $0,"第三行"}' test1.txt
image-20210616162426978

循环

For

awk '{for(i=1;i<=NF;++i) print $i,i}' test1.txt
image-20210616165202664

While

awk '{i=1; while(i<=NF-1){print $0,++i}}' test1.txt
image-20210617100230170

Break

awk '{for(i=1;i<=NF;++i){if(i==2)break;print $i,i}}' test1.txt
image-20210617102621322

Continue

awk '{for(i=1;i<=NF;++i){if(i<=2)continue;print $i,i}}' test1.txt
image-20210617102733695

Exit

exit 表示退出 awk 命令。当 awk 语句中有 exitEND{commands}语句块 的时候,exit 并不是表示退出 awk 命令,而是表示直接执行 END{commands} 语句块中的内容!

awk 'NR==1{print $0} NR==2{print $0}' test1.txt
awk 'NR==1{print $0;exit} NR==2{print $0}' test1.txt
awk 'NR==1{print $0;exit} NR==2{print $0} END{print "end"}' test1.txt
image-20210617104411688

数组

数组使用的语法格式

array_name[index]=value

array_name:数组的名称

index:数组索引

value:数组中元素所赋予的值

创建数组

awk 'BEGIN{group["yi"]="一"; group["er"]="二";print group["yi"]"\n"group["er"]}'
image-20210617135539332

删除数组元素

delete array_name[index]

awk 'BEGIN{group["yi"]="一"; group["er"]="二";delete group["yi"];print group["yi"]"\n"group["er"]}'
image-20210617135719064

常用内置函数

函数名 作用
int(X) 返回 X 的截断至整数的值
rand() 返回任意数字 n,其中 0 <= n < 1
srand(x) 建立 rand() 的新的种子数,如果没有指定种子数目,就用当天的时间。返回旧的种子数
gsub(r,s,t) 在字符串 t 中,用字符串 s 替换和正则表达式 r 匹配的所有字符串。返回替换的个数,如果没有给出 t,默认为 $0
length(s) 返回字符串 s 的长度,当没有给出 s 时,返回 $0 的长度
split(s,a,sep) 使用字段分隔符 sep 将字符串 s 分解到数组 a 的元素中,返回元素的个数。如果没有给出 sep,则使用 FS。数组分隔和字段分隔采用同样的方式
sub(r,s,t) 在字符串 t 中用 s 替换正则表达式 r 的首次匹配。如果成功则返回 1,否则返回 0,如果没有给出 t,则默认为 $0
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容