awk 入门 强大的文本分析工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
如果想在 V2EX 获得更好的推广效果,欢迎了解 PRO 会员机制:
pro/about
linuxcn

awk 入门 强大的文本分析工具

  •  
  •   linuxcn 2019 年 11 月 13 日 1724 次点击
    这是一个创建于 2355 天前的主题,其中的信息可能已经有所发展或是发生改变。

    让我们开始使用它。

    awk 是用于 Unix 和类 Unix 系统的强大文本解析工具,但是由于它有可编程函数,因此你可以用它来执行常规解析任务,因此它也被视为一种编程语言。你可能不会使用 awk 开发下一个 GUI 应用,并且它可能不会代替你的默认脚本语言,但是它是用于特定任务的强大程序。

    这些任务或许是惊人的多样化。了解 awk 可以解决你的哪些问题的最好方法是学习 awk。你会惊讶于 awk 如何帮助你完成更多工作,却花费更少的精力。

    awk 的基本语法是:

    awk [options] 'pattern {action}' file 

    首先,创建此示例文件并将其保存为 colours.txt

    name color amount apple red 4 banana yellow 6 strawberry red 3 grape purple 10 apple green 8 plum purple 2 kiwi brown 4 potato brown 9 pineapple yellow 5 

    数据被一个或多个空格分隔为列。以某种方式组织要分析的数据是很常见的。它不一定总是由空格分隔的列,甚至可以不是逗号或分号,但尤其是在日志文件或数据转储中,通常有一个可预测的格式。你可以使用数据格式来帮助 awk 提取和处理你关注的数据。

    打印列

    awk 中,print 函数显示你指定的内容。你可以使用许多预定义的变量,但是最常见的是文本文件中以整数命名的列。试试看:

    $ awk '{print $2;}' colours.txt color red yellow red purple green purple brown brown yellow 

    在这里,awk 显示第二列,用 $2 表示。这是相对直观的,因此你可能会猜测 print $1 显示第一列,而 print $3 显示第三列,依此类推。

    要显示全部列,请使用 $0

    美元符号($)后的数字是表达式,因此 $2$(1+1) 是同一意思。

    有条件地选择列

    你使用的示例文件非常结构化。它有一行充当标题,并且各列直接相互关联。通过定义条件,你可以限定 awk 在找到此数据时返回的内容。例如,要查看第二列中与 yellow 匹配的项并打印第一列的内容:

    awk '$2=="yellow"{print $1}' file1.txt banana pineapple 

    正则表达式也可以工作。此表达式近似匹配 $2 中以 p 开头跟上任意数量(一个或多个)字符后继续跟上 p 的值:

    $ awk '$2 ~ /p.+p/ {print $0}' colours.txt grape purple 10 plum purple 2 

    数字能被 awk 自然解释。例如,要打印第三列包含大于 5 的整数的行:

    awk '$3>5 {print $1, $2}' colours.txt name color banana yellow grape purple apple green potato brown 

    字段分隔符

    默认情况下,awk 使用空格作为字段分隔符。但是,并非所有文本文件都使用空格来定义字段。例如,用以下内容创建一个名为 colours.csv 的文件:

    name,color,amount apple,red,4 banana,yellow,6 strawberry,red,3 grape,purple,10 apple,green,8 plum,purple,2 kiwi,brown,4 potato,brown,9 pineapple,yellow,5 

    只要你指定将哪个字符用作命令中的字段分隔符,awk 就能以完全相同的方式处理数据。使用 --field-separator(或简称为 -F)选项来定义分隔符:

    $ awk -F"," '$2=="yellow" {print $1}' file1.csv banana pineapple 

    保存输出

    使用输出重定向,你可以将结果写入文件。例如:

    $ awk -F, '$3>5 {print $1, $2} colours.csv > output.txt 

    这将创建一个包含 awk 查询内容的文件。

    你还可以将文件拆分为按列数据分组的多个文件。例如,如果要根据每行显示的颜色将 colours.txt 拆分为多个文件,你可以在 awk 中包含重定向语句来重定向每条查询

    $ awk '{print > $2".txt"}' colours.txt 

    这将生成名为 yellow.txtred.txt 等文件。

    在下一篇文章中,你将了解有关字段,记录和一些强大的 awk 变量的更多信息。

    本文改编自社区技术播客 Hacker Public Radio


    via: https://opensource.com/article/19/10/intro-awk

    作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

    本文由 LCTT 原创编译,Linux 中国 荣誉推出

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2792 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 12:40 PVG 20:40 LAX 05:40 JFK 08:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86