搜索
写经验 领红包

liux的awk用法(liuxawk命令详解)

在生活中,很多人可能想了解和弄清楚Linux AWK 基本操作的相关问题?那么关于linux的awk用法的答案我来给大家详细解答下。

linux的awk用法(linux awk命令详解)

awk 是处理文本文件的一个应用程序,几乎所有Linux系统都自带这个程序。

它依次处理文件的每一行,并读取里面的每一个字段。对于日志,表格那样的每行格式相同的文本文件,awk可能是最方便有效的工具。

基本用法

awk 的基本用法就是下面的形式。

示例$ awk &39; demo.txt

上面示例中,demo.txt是awk所要处理的文本文件,前面单引号内部有一个大括号,里面就是每一行的处理动作print $0, 其中,print 是打印命令,$0代表当前行,上面命令的执行结果,就是把每一行原样打印出来。

$ echo &39; | awk &39;study awk

上面的代码中,print $0就是把标准输入 study test, 重新打印一遍。

awk 会根据空格和制表符,将每一行分成若干字段,依次用$1, $2, $3代表第一个字段,第二个字段,第三个字段等等。

$ echo &39; | awk &39;awk

上面代码中,$2代表study awk 的第二个字段 awk。

为了举例方便,将以下脚本保存为demo.txt

root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/dev:/usr/sbin/nologinsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/usr/sbin/nologinman:x:6:12:man:/var/cache/man:/usr/sbin/nologinlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologinmail:x:8:8:mail:/var/mail:/usr/sbin/nologinnews:x:9:9:news:/var/spool/news:/usr/sbin/nologinuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologinproxy:x:13:13:proxy:/bin:/usr/sbin/nologinwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologinbackup:x:34:34:backup:/var/backups:/usr/sbin/nologinlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologinirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin

这个文件的字段分隔符是冒号:,所以要用-F 参数指定分割符为冒号。然后,才能提取到它的第一个字段。

$ awk -F &39; &39; demo.txtrootdaemonbinsyssyncgamesmanlpmailnewsuucpproxywww-databackuplistirc

变量

除了$+数字表示某个字段,awk还提供其它一些变量。

变量NF表示当前行有多少个字段,因此$NF就代表最后一个字段。

$ echo &39; | awk &39;test

$(NF-1) 代表倒数第二个字段

$ awk -F &39; &39; demo.txtroot /rootdaemon /usr/sbinbin /binsys /devsync /bingames /usr/gamesman /var/cache/manlp /var/spool/lpdmail /var/mailnews /var/spool/newsuucp /var/spool/uucpproxy /binwww-data /var/wwwbackup /var/backupslist /var/listirc /var/run/ircd

上面的代码中,print命令里面的逗号,表示输出的时候,两个部分之间使用空格分割。

变量NR表示当前处理的是第几行。

$ awk -F &39; &34;) &39; demo.txt1) root2) daemon3) bin4) sys5) sync6) games7) man8) lp9) mail10) news11) uucp12) proxy13) www-data14) backup15) list16) irc

上面代码中,print 命令里面,如果原样输出字符,要放在双引号里面。

awk 的其它内置变量如下:

FILENAME: 当前文件名FS:字段分隔符,默认是空格和制表符RS:行分割符,用于分隔每一行,默认是换行符OFS:输出字段的分割符,用于打印时分隔字段,默认是空格。ORS:输出记录的分割符,用于打印时分隔记录,默认为换行符。OFMT:数字输出的格式,默认为%.6g。

函数

awk 还提供了一些内置函数,方便对原始数据的处理

函数toupper() 用于将字符转为大写

$ awk -F &39; &39; demo.txtROOTDAEMONBINSYSSYNCGAMESMANLPMAILNEWSUUCPPROXYWWW-DATABACKUPLISTIRC

上面代码中,第一个字段输出时都变成了大写。

其它常用函数如下:

tolower() : 字符转为小写length() : 返回字符串长度substr() : 返回子字符串sin () : 正弦cos () : 余弦sqrt () : 平方根rand () : 随机数

条件

awk 允许指定输出条件,只要输出符合条件的行。

输出条件要写在动作的前面。

$ awk &39; 文件名
$ awk -F &39; &39; demo.txtdaemonbinsysgamesmanlpmailnewsuucpproxywww-databackuplistirc

上面代码中,print 命令前面是一个正则表达式,只输出包含usr字符串的行。

39;:&39;NR % 2 == 1 {print $1}&输出第三行以后的行

$ awk -F &39; &39; demo.txtsyssyncgamesmanlpmailnewsuucpproxywww-databackuplistirc

下面的例子输出第一个字段等于指定值的行。

$ awk -F &39; &34;root&39; demo.txtroot$ awk -F &39; &34;root&34;bin&39; demo.txtrootbin

if 语句

awk 提供了 if 结构,用于编写复杂的条件。

$ awk -F &39; &34;m&39; demo.txtrootsyssyncmanmailnewsuucpproxywww-data

上面代码输出第一个字段的第一个字符大于m的行。

if 结构还可以指定else 部分。

$ awk -F &39; &34;m&34;----&39; demo.txtroot--------syssync----man----mailnewsuucpproxywww-data------------

温馨提示:通过以上关于Linux AWK 基本操作内容介绍后,相信大家有新的了解,更希望可以对你有所帮助。