您的位置:首页 > 运维架构 > Linux

linux的awk命令如何用?

2016-07-04 14:17 656 查看
awk:用于一行中分成数个“字段”来处理。适合处理 	小型数据。
运行模式:awk '条件类型1{动作1} 条件类型2{动作2} ...' filename

# last | awk '{print $1 "\t" $3}' <== 查看登录者的数据,只显示登录名和ip地址,并以[tab]隔开

awk 的内置变量
变量名称	代表的含义

NF	每一行($0)拥有的字段总数

NR	当前 awk 所处理的是 “第几行” 数据

FS	当前分隔符,默认空格键

awk 的逻辑运算符
运算单元	代表含义
>	大于
<	小于
>=	大于或等于
<=	小于或等于
==	等于
!=	不等于

范例:
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}' <== 文件/etc/passwd是以":"分隔的,查看第三栏小于10的数据,并且只显示帐号与第三栏

ps -aux | grep pyt | awk '{print $2}'查看Python的所有进程,并且显示进程号pid。

入门实例

假设last -n 5的输出如下
[root@www ~]# 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个域。默认域分隔符是"空白键" 或 "[tab]键",所以$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}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: