AWK 命令

阅读目录

  • 入门实例
回到顶部

入门实例

last -n 5 仅取出前五行
root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in

root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)

root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)

dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)

root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)

如果只是显示最近登录的5个账号

#last -n 5 | awk  '{print $1}'

root

root

root

dmtsai

root

awk工作流程是这样的:读入有’n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是”空白键” 或 “键”,所以$1表示登录用户,$3表示登录用户ip,以此类推。

显示/etc/passwd的账户
#cat /etc/passwd |awk  -F ':'  '{print $1}'  

root

daemon

bin

sys

这种是awk+action的示例,每行都会执行action{print $1}。

-F指定域分隔符为’:’。

显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
#cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'

root    /bin/bash

daemon  /bin/sh

bin     /bin/sh

sys     /bin/sh
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加”blue,/bin/nosh”。
cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'

name,shell

root,/bin/bash

daemon,/bin/sh

bin,/bin/sh

sys,/bin/sh

....

blue,/bin/nosh

awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

搜索/etc/passwd有root关键字的所有行
#awk -F: '/root/' /etc/passwd

root:x:0:0:root:/root:/bin/bash

这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。

搜索支持正则,例如找root开头的: awk -F: '/^root/’ /etc/passwd

搜索/etc/passwd有root关键字的所有行,并显示对应的shell
# awk -F: '/root/{print $7}' /etc/passwd            

/bin/bash

这里指定了action{print $7}

awk内置变量

awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

ARGC 命令行参数个数

ARGV 命令行参数排列

ENVIRON 支持队列中系统环境变量的使用

FILENAME awk浏览的文件名

FNR 浏览文件的记录数

FS 设置输入域分隔符,等价于命令行 -F选项

NF 浏览记录的域的个数

NR 已读的记录数

OFS 输出域分隔符

ORS 输出记录分隔符

RS 控制记录分隔符

此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,……以此类推

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
#awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash

filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh

filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh

filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
使用printf替代print,可以让代码更加简洁,易读
awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%sn",FILENAME,NR,NF,$0)}' /etc/passwd

print和printf

awk中同时提供了print和printf两种打印输出的函数。

其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。

printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。

(0)

相关推荐

  • 文本处理工具awk

    文本处理工具awk awk:(Aho, Weinberger, Kernighan,)报告生成器,格式化文本输出 有多种版本:New awk(nawk),GNU awk( gawk) [toc]## ...

  • Linux Shell

    特殊字符用来处理参数 $# 传递到脚本的参数个数$* 以一个单字符串显示所有向脚本传递的参数. 如"$*"用「"」括起来的情况.以"$1 $2 - $n&quo ...

  • awk简介

    本质: 是一门编程语言,有自己的语法和库函数. 工作机理: 读取每一行 按分隔符把这一行切成多个(不指定分隔符的话,空白或者连续空白就是分隔符) $1:代表第一列:$2:第二列.... $0:整行内容 ...

  • 10个超级棒的Awk命令

    Awk命令是处理数据的强大工具.它获取输入数据,对其进行操作,并在标准输出中给出结果.可以对文件的行和列执行各种操作. 要有效地处理数据,了解"awk"命令的基本要素是非常重要的, ...

  • awk命令常用功能及参数选项 Linux系统运维

    awk是Linux工作中的重要工具,掌握awk工具的运用,必将使得运维工作得心应手.awk不仅是Linux系统中的一个命令,还是一种编程语言,可以用来处理数据和生成报告.处理的数据可以是一个或多个文件 ...

  • (awk命令在mac和Ubuntu下面表现不一样)生信编程200题邀请优秀本科生加入一起攻克

    最近在带领学徒,重现当初的 »生信技能树›互动作业›脚本能力实践›生信人必练的200个数据处理任务 其中第11题,很有趣:把文件内容按照染色体分开写出 学徒问我为什么标准答案是错的,然后我验证后的确发 ...

  • Linux awk 命令详解

    awk是行处理器:相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或处理缓慢的问题,常用来格式化文本信息. awk处理过程:依次对每一行进行处理,然后输出.①读取被匹配到的行数据:②按照输入分隔 ...

  • Linux高级运维命令(awk)

    引言 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  • Linux命令awk,sed使用

    写在前面 perl-oneliner诅咒:即如果你相对熟练perl-oneliner的撰写之后,你就学不会awk和sed. -- CJ 以下全文转载,点击阅读原文,可见Balloon_vine简书 a ...

  • 洪学智看待180师:志司太专注进攻,三兵团的命令过于模糊

    作为志愿军副司令员,洪学智对180师的问题也做了总结.他从志司.三兵团和60军.郑其贵三个层面详细分析了当时的战场态势及相关人员的临场处理情况,总结得非常客观.全面. 洪学智 志司:太专注进攻,对敌人 ...

  • grep 命令搜索 带空格的字符

    grep - n ' a[[:space:]]b' 就能搜索到 'a    b'类似的字符了 grep "^#[:space:]*" /etc/inittab 这个命令中" ...

  • 凤凰男命令前妻复婚,自认为“有钱能使鬼推磨”,结果却自取其辱

    我有酒和茶. 你有故事,就来找我. 01 虽然很多人说要"做自己",但真正能"做自己"的人并不太多,很多人更倾向于合群,倾向于被同化,甚至觉得自己跟别人不一样就 ...