位置: 编程技术 - 正文

Linux下的命令行编程工具Awk的入门简介(linux命令行在哪)

编辑:rootadmin

推荐整理分享Linux下的命令行编程工具Awk的入门简介(linux命令行在哪),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:linux的命令行指的是什么,linux命令行大全怎么样,linux命令行在哪,linux里的命令,总结linux命令行的主要用法,linux里的命令,总结linux命令行的主要用法,linux的命令行指的是什么,内容如对您有帮助,希望把文章链接给更多的朋友!

什么是Awk

Awk是一种小巧的编程语言及命令行工具。(其名称得自于它的创始人Alfred Aho、Peter Weinberger 和 Brian Kernighan姓氏的首个字母)。它非常适合服务器上的日志处理,主要是因为Awk可以对文件进行操作,通常以可读文本构建行。我说它适用于服务器是因为日志文件,转储文件(dump files),或者任意文本格式的服务器终止转储到磁盘都会变得很大,并且在每个服务器你都会拥有大量的这类文件。如果你经历过这样的情境——在没有像Splunk或者其他等价的工具情况下不得不在个不同的服务器里分析几G的文件,你会觉得去获取和下载所有的这些文件并分析他们是一件很糟糕的事。

我亲身经历过这种情境。当一些Erlang节点将要死掉并留下一个MB到4GB的崩溃转储文件(crash dump)时,或者当我需要在一个小的个人服务器(叫做VPS)上快速浏览日志,查找一个常规模式时。

在任何情况下,Awk都不仅仅只是用来查找数据的(否则,grep或者ack已经足够使用了)——它同样使你能够处理数据并转换数据。代码结构

Awk脚本的代码结构很简单,就是一系列的模式(pattern)和行为(action):

复制代码代码如下:# comment Pattern1 { ACTIONS; } # comment Pattern2 { ACTIONS; } # comment Pattern3 { ACTIONS; } # comment Pattern4 { ACTIONS; }

扫描文档的每一行时都必须与每一个模式进行匹配比较,而且一次只匹配一个模式。那么,如果我给出一个包含以下内容的文件:

复制代码代码如下:this is line 1 this is line 2

this is line 1 这行就会与Pattern1进行匹配。如果匹配成功,就会执行ACTIONS。然后this is line 1 会和Pattern2进行匹配。如果匹配失败,它就会跳到Pattern3进行匹配,以此类推。

一旦所有的模式都匹配过了,this is line 2 就会以同样的步骤进行匹配。其他的行也一样,直到读取完整个文件。

简而言之,这就是Awk的运行模式数据类型

Awk仅有两个主要的数据类型:字符串和数字。即便如此,Awk的字符串和数字还可以相互转换。字符串能够被解释为数字并把它的值转换为数字值。如果字符串不包含数字,它就被转换为0.

它们都可以在你代码里的ACTIONS部分使用 = 操作符给变量赋值。我们可以在任意时刻、任意地方声明和使用变量,也可以使用未初始化的变量,此时他们的默认值是空字符串:“”。

最后,Awk有数组类型,并且它们是动态的一维关联数组。它们的语法是这样的:var[key] = value 。Awk可以模拟多维数组,但无论怎样,这是一个大的技巧(big hack)。模式

可以使用的模式分为三大类:正则表达式、布尔表达式和特殊模式。

正则表达式和布尔表达式

你使用的Awk正则表达式比较轻量。它们不是Awk下的PCRE(但是gawk可以支持该库——这依赖于具体的实现!请使用 awk

–version查看),然而,对于大部分的使用需求已经足够了:

复制代码代码如下:/admin/ { ... } # any line that contains 'admin' /^admin/ { ... } # lines that begin with 'admin' /admin$/ { ... } # lines that end with 'admin' /^[0-9.]+ / { ... } # lines beginning with series of numbers and periods /(POST|PUT|DELETE)/ # lines that contain specific HTTP verbs

注意,模式不能捕获特定的组(groups)使它们在代码的ACTIONS部分执行。模式是专门匹配内容的。

布尔表达式与PHP或者Javascript中的布尔表达式类似。特别的是,在awk中可以使用&&(“与”)、||(“或”)、!(“非”)操作符。你几乎可以在所有类C语言中找到它们的踪迹。它们可以对常规数据进行操作。

与PHP和Javascript更相似的特性是比较操作符,==,它会进行模糊匹配(fuzzy matching)。因此“”字符串等于,”″ == 表达式返回true。!= 操作符同样在awk里使用,并且别忘了其他常见的操作符:>,<,>=,和<=。

你同样可以混合使用它们:布尔表达式可以和常规表达式一起使用。 /admin/ || debug == true 这种用法是合法的,并且在遇到包含“admin”单词的行或者debug变量等于true时该表达式就会匹配成功。

注意,如果你有一个特定的字符串或者变量要与正则表达式进行匹配,~ 和!~ 就是你想要的操作符。 这样使用它们:string ~ /regex/ 和 string !~ /regex/。

同样要注意的是,所有的模式都只是可选的。一个包含以下内容的Awk脚本:

复制代码代码如下:{ ACTIONS }

对输入的每一行都将会简单地执行ACTIONS。特殊的模式

Linux下的命令行编程工具Awk的入门简介(linux命令行在哪)

在Awk里有一些特殊的模式,但不是很多。

第一个是BEGIN,它仅在所有的行都输入到文件之前进行匹配。这是你可以初始化你的脚本变量和所有种类的状态的主要地方。

另外一个就是END。就像你可能已经猜到的,它会在所有的输入都被处理完后进行匹配。这使你可以在退出前进行清除工作和一些最后的输出。

最后一类模式,要把它进行归类有点困难。它处于变量和特殊值之间,我们通常称它们为域(Field)。而且名副其实。域

使用直观的例子能更好地解释域:

复制代码代码如下:# According to the following line # # $1 $2 $3 # :: GET /foo/bar.html # _____________ _____________/ # $0 # Hack attempt? /admin.html$/ && $2 == "DELETE" { print "Hacker Alert!"; }

域(默认地)由空格分隔。$0 域代表了一整行的字符串。 $1 域是第一块字符串(在任何空格之前), $2 域是后一块,以此类推。

一个有趣的事实(并且是在大多是情况下我们要避免的事情),你可以通过给相应的域赋值来修改相应的行。例如,如果你在一个块里执行 $0 = “HAHA THE LINE IS GONE”,那么现在下一个模式将会对修改后的行进行操作而不是操作原始的行。其他的域变量都类似。行为

这里有一堆可用的行为(possible actions),但是最常用和最有用的行为(以我的经验来说)是:

复制代码代码如下: { print $0; } # prints $0. In this case, equivalent to 'print' alone { exit; } # ends the program { next; } # skips to the next line of input { a=$1; b=$0 } # variable assignment { c[$1] = $2 } # variable assignment (array) { if (BOOLEAN) { ACTION } else if (BOOLEAN) { ACTION } else { ACTION } } { for (i=1; i<x; i++) { ACTION } } { for (item in c) { ACTION } }

这些内容将会成为你的Awk工具箱的主要工具,在你处理日志之类的文件时你可以随意地使用它们。

Awk里的变量都是全局变量。无论你在给定的块里定义什么变量,它对其他的块都是可见的,甚至是对每一行都是可见的。这严重限制了你的Awk脚本大小,不然他们会造成不可维护的可怕结果。请编写尽可能小的脚本。函数

可以使用下面的语法来调用函数:

复制代码代码如下:{ somecall($2) }

这里有一些有限的内置函数可以使用,所以我可以给出这些函数的通用文档(regular documentation)。

用户定义的函数同样很简单:

复制代码代码如下:# function arguments are call-by-value function name(parameter-list) { ACTIONS; # same actions as usual } # return is a valid keyword function add1(val) { return val+1; }

特殊变量

除了常规变量(全局的,可以在任意地方使用),这里还有一系列特殊的变量,它们的的作用有点像配置条目(configuration entries):

复制代码代码如下:BEGIN { # Can be modified by the user FS = ","; # Field Separator RS = "n"; # Record Separator (lines) OFS = " "; # Output Field Separator ORS = "n"; # Output Record Separator (lines) } { # Can't be modified by the user NF # Number of Fields in the current Record (line) NR # Number of Records seen so far ARGV / ARGC # Script Arguments }

我把可修改的变量放在BEGIN里,因为我更喜欢在那重写它们。但是这些变量的重写可以放在脚本的任意地方然后在后面的行里生效。示例

以上的就是Awk语言的核心内容。我这里没有大量的例子,因为我趋向于使用Awk来完成快速的一次性任务。

不过我依然有一些随身携带的脚本文件,用来处理一些事情和测试。我最喜欢的一个脚本是用来处理Erlang的崩溃转储文件,形如下面的:

复制代码代码如下:=erl_crash_dump:0.3 Tue Nov :: Slogan: init terminating in do_boot () System version: Erlang/OTP [erts-6.2] [source] [-bit] [smp:8:8] [async-threads:] [hipe] [kernel-poll:false] Compiled: Fri Sep :: Taints: Atoms: =memory total: processes: processes_used: system: atom: atom_used: binary: code: ets: =hash_table:atom_tab size: used: ... =allocator:instr option m: false option s: false option t: false =proc:<0.0.0> State: Running Name: init Spawned as: otp_ring0:start/2 Run queue: 0 Spawned by: [] Started: Tue Nov :: Message queue length: 0 Number of heap fragments: 0 Heap fragment data: 0 Link list: [<0.3.0>, <0.7.0>, <0.6.0>] Reductions: Stack+heap: OldHeap: Heap unused: OldHeap unused: Memory: Program counter: 0xff (init:boot_loop/2 + ) CP: 0x (invalid) =proc:<0.3.0> State: Waiting ... =port:#Port<0.0> Slot: 0 Connected: <0.3.0> Links: <0.3.0> Port controls linked-in driver: efile =port:#Port<0.> Slot: Connected: <0.3.0> ...

产生下面的结果:

复制代码代码如下:$ awk -f queue_fun.awk $PATH_TO_DUMP MESSAGE QUEUE LENGTH: CURRENT FUNCTION ====================================== : io:wait_io_mon_reply/2 : io:wait_io_mon_reply/2 : io:wait_io_mon_reply/2 : io:wait_io_mon_reply/2 : io:wait_io_mon_reply/2 : io:wait_io_mon_reply/2 ...

这是在Erlang进程里运行的函数列表,它们导致了mailboxe变得很庞大。脚本在这:

复制代码代码如下:# Parse Erlang Crash Dumps and correlate mailbox size to the currently running # function. # # Once in the procs section of the dump, all processes are displayed with # =proc:<0.M.N> followed by a list of their attributes, which include the # message queue length and the program counter (what code is currently # executing). # # Run as: # # $ awk -v threshold=$THRESHOLD -f queue_fun.awk $CRASHDUMP # # Where $THRESHOLD is the smallest mailbox you want inspects. Default value # is . BEGIN { if (threshold == "") { threshold = # default mailbox size } procs = 0 # are we in the =procs entries? print "MESSAGE QUEUE LENGTH: CURRENT FUNCTION" print "======================================" } # Only bother with the =proc: entries. Anything else is useless. procs == 0 && /^=proc/ { procs = 1 } # entering the =procs entries procs == 1 && /^=/ && !/^=proc/ { exit 0 } # we're done # Message queue length: # 1 2 3 4 /^Message queue length: / && $4 >= threshold { flag=1; ct=$4 } /^Message queue length: / && $4 < threshold { flag=0 } # Program counter: 0xf5fb8cb (io:wait_io_mon_reply/2 + ) # 1 2 3 4 5 6 flag == 1 && /^Program counter: / { print ct ":", substr($4,2) }

你跟上思路没?如果跟上了,你已经了解了Awk。恭喜!

在Linux系统中将tar文件解压到不同的目录中的教程 你不必使用cd命令切换到其他的目录并解压。可以使用下面的语法解压一个文件:语法典型Unixtar语法:复制代码代码如下:tar-xffile.name.tar-C/path/to/directoryG

在Linux系统中安装使用WPS的方法 KingsoftOffice是一套办公套件,支持多个平台,包括Windows,Linux,iOS和Android。它包含三个组件:Writer(WPS文字)用来文字处理,Presentation(WPS演示)支持幻灯

在Linux的命令行下使用Evernote的教程 Geeknote的安装Geeknote是使用Python开发的。因此,在开始之前请确保你已经安装了Python(最好是2.7的版本)和git。在Debian、Ubuntu和LinuxMint中复制代码代码如

标签: linux命令行在哪

本文链接地址:https://www.jiuchutong.com/biancheng/366813.html 转载请保留说明!

上一篇:在Linux命令行中创建和展示幻灯片的教程(在Linux命令行中快速删除光标前的快捷键是什么?)

下一篇:在Linux系统中将tar文件解压到不同的目录中的教程(在linux系统中,用来存放系统所需要的)

  • 自己房子出租发布信息
  • 一般纳税人认定表
  • 工商年报的纳税总额是什么
  • 经营所得和企业所得
  • 企业所得税纳税义务人
  • 土地出让金会涨价吗
  • 建筑发票开具与土增税扣有什么关系?
  • 收到以前年度银行手续费发票
  • 装修工程一切险
  • 逐期增长量与累计增长量的关系是
  • 现金日记账本月合计的红线画法
  • 税控设备发行是什么行业
  • 发票开工程服务和工程款的区别
  • 一般纳税人财务报表月报还是季报
  • 固定资产被盗报警
  • 金融债券利息收入免企业所得税吗
  • 无形资产转让要交所得税吗
  • 房地产营改增后开票
  • 税务实名制法人和财务负责人可以是同一人吗?
  • 企业的经济成本由什么构成
  • 事业单位购买固定资产费自行
  • 固定资产折旧率是多少
  • 计提坏账准备的科目
  • 企业押金怎么管理
  • 培训费没有发票怎么办
  • 减免的附加税要计税吗
  • 收到空头支票解释怎么写
  • 辅助生产车间照明用电计入哪个科目
  • 关于幼儿园会没课程的会刊
  • 支付代账公司费用 怎么写凭证
  • php中cookie和session的区别
  • 关闭系统的命令位于什么菜单中
  • 绿萝怎么样养
  • 企业之间拆借资金
  • 厂房改造支出可以计入厂房价值吗
  • 长期待摊费用应该怎么摊销
  • php常用命令
  • js删除对象的方法
  • 泛型 static
  • 基于Java+SpringBoot+vue+element驾校管理系统设计和实现
  • 学习笔记:深度学习(2)——BP神经网络
  • linux如何使用
  • 收回外币应收账款如何处理
  • python处理mysql如何拿到表头
  • 即征即退实际退税额35栏可以不填吗
  • 缴纳税款滞纳金怎么算
  • sql中drop的用法
  • 印花税征税范围及税率
  • 在mysql中设置事务保存点
  • 综合所得减除费用标准为60000.00元/年
  • 微信,支付宝等第三方支付对货币的影响
  • 借款费用为什么可以企业所得税税前扣除
  • 主营业务成本借贷方向增减
  • 什么是无形资产包括哪些
  • 商业承兑汇票结算会计分录
  • 4s店收取保险服务费合理吗
  • 成立教育培训司
  • 买断式与回购式
  • 生育津贴案件
  • 招待费可以做成什么科目
  • 留抵税额可以抵欠税吗
  • sql server 复制表中行数据
  • vmware如何用
  • mac电脑技巧
  • win8安全模式黑屏
  • 演示模式怎么设置
  • linux中修改root密码
  • nalntsrv.exe - nalntsrv是什么进程 有什么用
  • ixapplet.exe - ixapplet是什么进程 有何作用
  • 不要使用CSS Expression的原因分析
  • jquery tab
  • js实现生成随机的圆
  • js判断浏览器内核和版本
  • 用python编写的程序称为
  • 小规模企业所得税怎么算
  • 包装物押金收入含税吗
  • 税务文书送达回证模板
  • 发票怎样上传?
  • 在山东省一个月水费大概多少
  • 什么是党建工作一体化
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设