ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux 三剑客之awk

2021-12-23 23:06:55  阅读:166  来源: 互联网

标签:sbin etc awk Linux print root localhost 三剑客


目录


Linux 三剑客之awk

查看源图像

简介

awk主要是用来格式化文本,也有人称awk是一种语言,类似 C,awk 是三剑客的老大,利剑出鞘,必会不同凡响。

应用场景

  • 过滤,统计,计算,统计日志

awk执行流程图

  • awk读取文件之前执行BEGIN,注意BEGIN读取文件之前就可以执行,后面不跟文件,也可以执行

    # 直接执行BEGIN,不跟文件
    [root@localhost ~]# awk 'BEGIN{print "直接执行"}'
    直接执行
    
  • awk读取文件时,执行BODY块

  • awk读取文件后,执行END块

  • 格式awk [参数] 'BEGIN{读取文件前执行的内容}条件{读取文件执行的动作}END{读取完文件执行的内容}' [文件路径]

查看源图像

完整流程示例(无条件要求演示):

读取文件前可以加条件,条件包括正则判断等,继续往下看,看完就明白了~

image


awk生命周期

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

# 生命周期如下:
接收一行作为输入
把刚刚读入进来得到文本进行分解
使用处理规则处理文本
输入一行,赋值给$0,直至处理完成($0代表当前行的内容)
把处理完成之后的所有的数据交给END{}来再次处理

awk内置(预定义)变量

内置变量符号 功能描述
$0 代表当前行
$n 代表第n列
NF 记录当前行的字段数(当前行的列数),$NF表示最后一列
NR 用来记录行号(相当于计数器)
FS 指定文本内容字段分隔符(默认是空格)
RS 文本分割符 默认为换行符
OFS 指定打印字段分隔符(默认空格)
ORS 输出的记录分隔符 默认为换行符

行与列描述

名称 描述 说明
记录record 每一行结尾默认通过回车分隔
记录字段/域field 列与列默认以空格分隔,可以指定分隔符

取行

awk取行字符 描述
NR==1 取出第1行
NR>=1&&NR<=5 取出1到5行 ---范围取
//,// 正则取,谁开头到谁结尾
符号 > < >= <= == !=
# 输出第一行
[root@localhost ~]# awk 'NR==1' a.sh 
 asdfgdghgf aadadadad
 
# 输出1到5行
[root@localhost ~]# awk 'NR>=1&&NR<=5{print NR,$0}' a.sh 
1  asdfgdghgf aadadadad
2   sdasdasda hjhjjg
3 asd adas sdasdas asdasdahgf
4 asdas asdasdad adasdasd
5 baaaaaaaaaaaaaaaaaaaabbbbbbbb

# 正则取,h开头的行,到m开头的行
[root@localhost ~]# cat a.sh | nl
     1	hammerze
     2	hanswang
     3	jianiubi
     4	guangtou
     5	meimei
     6	zhengyu
     7	xuegongzi
[root@localhost ~]# awk '/^h/,/^m/ {print NR,$0}' a.sh 
1 hammerze
2 hanswang
3 jianiubi
4 guangtou
5 meimei

取列

  • -F指定分隔符,指定每一列结束标记(默认是空格,连续的空格Tab键),-F后也支持正则(案例4)
  • -v 修改变量
  • $数字:表示取出某一列
  • $0:表示整行的内容
  • 补充知识:column -t格式化输出,美化操作

image

awk '{print $0}' a.sh 输出的内容和cat的效果一样

[root@localhost ~]# awk '{print $0}' a.sh 
hammerze
hanswang
jianiubi
guangtou
meimei
zhengyu
xuegongzi
[root@localhost ~]# cat a.sh 
hammerze
hanswang
jianiubi
guangtou
meimei
zhengyu
xuegongzi

案例1:取出/etc/passwd文件中的第一列和最后一列

# 为例节省占用文章空间,这里输出5行
[root@localhost ~]# awk -F: '{print NR,$1,$NF}' /etc/passwd | column -t | head -n5
1   root             /bin/bash
2   bin              /sbin/nologin
3   daemon           /sbin/nologin
4   adm              /sbin/nologin
5   lp               /sbin/nologin

案例2:美化操作

[root@localhost ~]# awk -F: '{print NR,"用户名:"$1,"解释器:"$NF}' /etc/passwd | column -t | head -n5
1   用户名:root             解释器:/bin/bash
2   用户名:bin              解释器:/sbin/nologin
3   用户名:daemon           解释器:/sbin/nologin
4   用户名:adm              解释器:/sbin/nologin
5   用户名:lp               解释器:/sbin/nologin

案例3:将/etc/passwd文件的最后一列和第一列互换位置

[root@localhost ~]# awk -F':'  '{print $NF,$2,$3,$4,$5,$6,$1}' /etc/passwd | head -n5
/bin/bash x 0 0 root /root root
/sbin/nologin x 1 1 bin /bin bin
/sbin/nologin x 2 2 daemon /sbin daemon
/sbin/nologin x 3 4 adm /var/adm adm
/sbin/nologin x 4 7 lp /var/spool/lpd lp

# 这样得到的结果,和原来文件内容不一样缺少冒号
# 用-vOFS=:,这样空格就修改称原来的冒号就加回来了,`-F: == -vOFS=:`

[root@localhost ~]# awk -F: -vOFS=: '{print $NF,$2,$3,$4,$5,$6,$1}' /etc/passwd | head -n5
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp

案例4:取行和取列实现了文本内容“指哪打哪”,取行又取列

# 精确取ip
[root@localhost ~]# ip a | awk -F "[ /]+" 'NR==3{print $3}'
127.0.0.1
# 剖析命令
awk :		 命令
-F"[ /]+" :	   选项
NR==3: 		   条件
{print $3} :   模式(动作) 

取行和取列主要用到的是比较,大于小于等于···


awk中的函数

  • print函数:打印
  • printf函数:格式化打印

函数搭配字符

搭配字符 功能
%s 代表字符串
%d 代表数字
- 左对齐
+ 右对齐
n 占用字符 eg:15代表占用15个字符长度
# 格式化输出,以|为分隔符,换行对齐输出,没有空格补齐,超出就怼出去
[root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd

# OFS输出分隔符,上面的结果打印5行看看
[root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd |head -n5
|      /bin/bash|root           |
|  /sbin/nologin|bin            |
|  /sbin/nologin|daemon         |
|  /sbin/nologin|adm            |
|  /sbin/nologin|lp             |

条件的分类

运算符参考表

image

格式awk [参数] 'BEGIN{读取文件前执行的内容}条件{读取文件执行的动作}END{读取完文件执行的内容}' [文件路径]

awk中的条件有如下的操作

标签:sbin,etc,awk,Linux,print,root,localhost,三剑客
来源: https://www.cnblogs.com/48xz/p/15725556.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有