linux:awk的使用

Linux:awk的使用

awk主要用来格式化文本

    一、awk的语法

格式:awk 【参数】【处理规则】【操作对象】

     二、参数

      -F:指定文本分割符(默认是以空格作为分隔符)

awk -F'f' '{print $NF}' 9.txt
'f'  这里是设置分隔符
1 打印系统所有用户的解析器
2 awk -F: '{print $NF}' /etc/passwd
案例

     三、awk的生命周期

      grep、sed和awk都是读一行处理一行,直至处理完成完成

       1.接收一行作为输入

       2.把刚刚读入进来的到文本进行分解

       3.使用处理规则处理文本‘

       4.输入一行,赋予给$0,直至处理完成

       5.把处理完成之后的所有的数据交给END{}来再次处理

      四、awk中的预定义变量

         $0:代表当前行

[root@localhost ~]# awk -F: '{print $0, "---"}' /etc/passwd

          $n:代表第n行

[root@localhost ~]# awk -F: '{print $1}' /etc/passwd

           NF:记录当前行的字段数

[root@localhost ~]# awk -F: '{print NF}' /etc/passwd
[root@localhost ~]# awk -F: '{print $NF}' /etc/passwd

           NR:用来记录行号

[root@localhost ~]# awk -F: '{print NR}' /etc/passwd

           FS:指定文本内容分割符(默认是空格)

[root@localhost ~]# awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd
FS 的优先级要高于 -F

           OFS:指定打印分隔符(默认空格)

[root@localhost ~]# awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd

        五、awk处理规则的执行流程

           BEGIN{ 这里面放的是执行前的语句 }

           END {这里面放的是处理完所有的行后要执行的语句 }

           //   分割字符串

           {}   存放输入命令集

        六、awk中的函数   

print       打印 
printf      格式化打印
%s          字符串
%d          数字
-           左对齐
+           右对齐
[root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd

里面的15是至少占用15字符

         七、awk中的定位

            1.正则表达式

[root@localhost ~]# awk -F: '/root/{print $0}' /etc/passwd
[root@localhost ~]# awk -F: '/^root/{print $0}' /etc/passwd

             2.比较表达式

>      大于
<      小于
>=     大于等于
<=     小于等于
~      正则匹配
!~    正则匹配(取反)
1 案例:要求打印属组ID大于属主ID的行
2 [root@localhost ~]# awk -F: '$4 > $3{print $0}' /etc/passwd
案例
1 案例:结尾包含bash
2 [root@localhost ~]# awk -F: '$NF ~ /bash/{print $0}' /etc/passwd
案例
1 案例:结尾不包含bash
2 [root@localhost ~]# awk -F: '$NF !~ /bash/{print $0}' /etc/passwd
案例

               3.逻辑表达式

&&     : 逻辑与(和)
||     :逻辑或(或)
!      :逻辑非(不)
1 [root@localhost ~]# awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd
2 [root@localhost ~]# awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd
3 [root@localhost ~]# awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd
案例

                4.算术表达式

+    加法
-    减法
*    乘法
/    除法
%    取余
1 案例:要求属组 + 属主的ID 大于 2000
2 [root@localhost ~]# awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
案例
1 案例:要求属组 * 属主的ID 大于 2000
2 [root@localhost ~]# awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd
案例
1 案例:要求打印偶数行
2 [root@localhost ~]# awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
案例
1 案例:要求打印奇数行
2 [root@localhost ~]# awk -F: 'NR % 2 == 1{print $0}' /etc/passwd
案例

                5.条件表达式

==        对等
>         大于
<         小于
>=        大于等于
<=        小于等于        
1 [root@localhost ~]# awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd
案例

               6.范围表达式

1 [root@localhost ~]# awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd
案例

           八、流程控制

              只存在循环之中

if
1 [root@localhost ~]# awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd
案例
格式:单分支  if(){}
     双分支  if(){}else{}
     多分支  if(){} if(){}else{}
for
1 [root@localhost ~]# awk -F: '{for(i=10;i>0;i--){print $0}}' /etc/passwd
案例
for(i="初始值";条件判断;游标){}   游标:每次处理变量
while   ;分割
1 [root@localhost ~]# awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd
案例
格式:while(条件判断){}
1  每隔5行,打印一行横线
2  -------------------------------------------------------------------------
3     
4     [root@localhost ~]# awk -F: '{if(NR%5==0){print "----------------"}print $0}' /etc/passwd
案例

 

posted @ 2021-12-22 17:35  Roseblacko  阅读(109)  评论(0编辑  收藏  举报