运维人员必须掌握--awk的简单用法

来源:互联网 发布:程序员种类 编辑:程序博客网 时间:2024/06/06 09:44

awk是由条件和动作组成,先判断条件,再执行动作

先读取文本中的第一行内容,对其进行条件的分隔和判断  执行动作

格式:
awk ‘条件1{动作1}条件2{动作2}。。’  文件名
条件:一般使用关系表达式作为条件(BEGIN/END。。)或者大小判断
动作:格式化输出,流程控制语句(复杂的awk语句)

[root@jason ~]# df -h
Filesystem                    Size  Used   Avail   Use%  Mounted on
/dev/mapper/vg_jason-lv_root              18G   2.1G  15G    13%  /
tmpfs                              939M  0    939M   0%   /dev/shm
/dev/sda1                     485M  
39M   421M   9%   /boot
/dev/sr0                            3.6G  3.6G  0     100%  /media

[root@jason ~]# df -h|grep /dev/sda1|awk '{print $5}'
9%
[root@jason ~]# df -h|grep /dev/sda1|awk '{print $5}'|cut -d "%" -f 1
9       

[root@jason ~]# awk '{FS=":"}{print $1 "\t" $3}' /etc/passwd
root:x:0:0:root:/root:/bin/bash       为什么会输出这个呢?  因为awk是先读取文本的第一行内容
bin     1 
daemon     2
adm     3
lp     4
sync     5

[root@jason ~]# awk 'BEGIN{FS=":"}{print $1 "\t" $3}' /etc/passwd   
root     0           
bin     1
daemon     2              以:为分隔符,开始就指定从BEGIN来提取文本内容
adm     3
lp     4
sync     5

[root@jason ~]# awk 'BEGIN{FS=":"}$3<=3{print $1 "\t"}' /etc/passwd
root     
bin                加入一个条件 第三列的数值<=3
daemon     

 
[root@jason ~]# awk 'BEGIN{printf "this is/etc/passwd"}BEGIN{FS=":"}$3<=5{print $1 "\t"}' /etc/passwd
this is /etc/passwd         在开始加入一行文字叙述
root     
bin     
daemon     
adm     
lp     
sync

[root@jason ~]# awk 'END{printf "this is /etc/passwd"}BEGIN{FS=":"}$3<=5{print $1 "\t"}' /etc/passwd
root     
bin     
daemon     
adm     
lp     
sync     
this is /etc/passwd    
结尾加入文字叙述

awk操作符

= += -= *= /= %= ^=            赋值操作符
?                        条件表达操作符
|| && !                    并、与、非
~ !~                        匹配操作符(匹配与不匹配)
< <= == != > >=                关系操作符
+ - * / % ^                算术操作符


FS用来设置域分隔符,如: 以冒号为分隔符FS=":"
NF为记录域个数(列数),在记录被读之后设置,常用$NF指定最后一列


$0表示使用所有域

[root@jason ~]# awk '{print $0}' passwd > pass
     
     将passwd的所有域 输出重定向到pass文件中   即:拷贝passwd到pass

[root@jason ~]# awk '{print $0}' passwd |tee pass

      将passwd的所有域 通过管道将结果通过tee传到pass中,并在屏幕上显示结果

$n 指定区域 (列)    

        [root@jason ~]# awk 'BEGIN{FS=":"}{print $1,"\t",$5}' passwd

     使用begin模式,FS指定以“:”为分隔符,截取第1、5列 显示到屏幕

    FS            设置域分隔符,相当于-F



在awk命令中传值  穿插if语句

    查询可用空间小于36000M的分区:

[root@jason ~]# df -m|awk '($4 ~ /^[0-9]/) {if ($4 < LIMIT) print $6"\t"
$4}' LIMIT=36000
/     14708
/dev/shm     939
/boot     421
/media     0

        

    查询当前用户登陆在哪个端口:

[root@jason ~]# who|awk '{if ($1 == user) print $1" you are connected to
"$2}' user=$LOGNAME
root you are connected to pts/0

使用~紧跟正则表达式可以匹配域,也可以用if,条件需要用()括起来


[root@jason ~]# awk '$0 ~ /ftp/' passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
 
     匹配passwd文件所有域中 含有ftp的行

[root@jason ~]# awk '$0 !~ /ologi/' passwd
root:x:0:0:root:/root:/bin/bash
      
     不匹配passwd含有ologi字符的行  


精确匹配   使用==并用双引号括起条件可以精确匹配条件


[root@jason ~]# awk 'BEGIN{FS=":"}{if ($1 == "root") print $0}' passwd
root:x:0:0:root:/root:/bin/bash

以”:“为分隔符  精确匹配第一列是root的所有列

其他匹配

大小写匹配           '/[Gg]reen/'   
匹配某个字符        ~ '/^...a/'   匹配第四个字符是a
匹配以X开头         ~ ' /^J/'     匹配以J开头
匹配x或xx            ~ '/blue/green/' 匹配蓝色或黄色

0 0
原创粉丝点击