码迷,mamicode.com
首页 > 其他好文 > 详细

Shel编程之awk

时间:2021-03-16 13:40:15      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:end   正式   dmi   ||   输出   简单   lock   mon   pattern   

1. awk工作模式

awk是一个文本处理工具,通常用于处理数据并生成结果报告
awk的命名来自它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母

语法格式

  1. awk ‘BEGIN{}pattern{commands}END{}‘ file
  2. standard output | awk ‘BEGIN{}pattern{commands}END{}‘
    | 语法格式 | 含义 |
    | ---------- | ------------------------ |
    | BEGIN{} | 正式处理数据之前进行 |
    | pattern | 匹配模式 |
    | {commands} | 处理命令,可以多行 |
    | END{} | 处理完所有匹配数据后执行 |

2. awk内置变量

内置变量 含义
$0 整行内容
$1-$n 当前行的第1-n个字段
NF 当前行的字段个数,也就是有多少列 Number Field
NR 当前行的行号,从1开始计数。 Number Row
FNR 多文件处理时,每个文件行号单独计算。 File Number Row
FS 输入字段分隔符,不指定默认以tab或空格进行分隔 Filed Separator
RS 输入行分隔符,默认回车换行 Row Separator
OFS 输出字段分隔符,默认为空格
ORS 输出行分隔符,默认为回车换行
$ awk ‘{print $0}‘ passwd # print 打印命令 $0 代表整行输出
$ awk ‘BEGIN{FS=":"}{print $1}‘ passwd # print 打印命令 $1 代表分割后的第一列,指定分隔符为:
nobody
root
daemon
$ awk ‘{print $1}‘ demo.txt # 默认以空格或tab进行分割的
$ awk ‘{print NF}‘ demo.txt # 内置变量直接写即可,不需要加$去引用

3. 格式化输出

格式符号 含义
%s 打印字符串
%d 打印十进制数
%f 打印浮点数
%x 打印十六进制数
%o 打印八进制数
%e 打印数字的科学记数法形式
%c 打印单个字符的ASCII码
$ awk ‘BEGIN{FS=":"}{printf "%s\n", $1}‘ passwd # 和print一样
$ awk ‘BEGIN{FS=":"}{printf "%s %s\n", $1,$3}‘ passwd
# 当指定位数后,默认使用右对齐, 如果不加入填充位数,默认右对齐
$ awk ‘BEGIN{FS=":"}{printf "%30s %20s\n", $1,$7}‘ passwd # 填充位数,默认右对齐, 右对其使用 + 
                        nobody       /usr/bin/false
                          root              /bin/sh
                        daemon       /usr/bin/false
                         _uucp     /usr/sbin/uucico
$ awk ‘BEGIN{FS=":"}{printf "%-30s %-20s\n", $1,$7}‘ passwd # 填充位数,左对齐, 左对齐使用 -
nobody                         /usr/bin/false
root                           /bin/sh
daemon                         /usr/bin/false
_uucp                          /usr/sbin/uucico
$ awk ‘BEGIN{FS=":"}{printf "%0.3f\n", $3}‘ passwd  # 保留3位小数
# 打印8进制或者18进制的时候显示前面的标识 %后面加上 # 即可
$ awk ‘BEGIN{FS=":"}{printf "%#x\n", $3}‘ passwd  # #x 表示加入16进制的标识0x
$ awk ‘BEGIN{FS=":"}{printf "%#o\n", $3}‘ passwd  # #o 表示加入16进制的标识0

4. 匹配模式

  1. 第一种匹配模式:RegExp
  2. 第二种模式匹配:关系运算符
语法格式 含义
RegExp 按正则表达式进行匹配
关系运算 按关系运算匹配
$ awk ‘BEGIN{FS=":"}/root/{print $0}‘ passwd # 包含root的行
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
$ awk ‘BEGIN{FS=":"}/^root/{print $0}‘ passwd # 以root开头的行
root:*:0:0:System Administrator:/var/root:/bin/sh
$ awk ‘BEGIN{FS=":"}$7=="/bin/bash"{print $0}‘ passwd #第7列是/bin/bash的匹配
_mbsetupuser:*:248:248:Setup User:/var/setup:/bin/bash
$ awk ‘BEGIN{FS=":"}$1=="root" || $1=="hdfs"{print $0}‘ passwd
关系运算符 说明
< 小于
> 大于
<= 小于等于
>= 大于等于
== 等于
!= 不等于
~ 匹配正则表达式
!~ 不匹配正则表达式
|| 布尔运算 或
&& 布尔运算 与
! 布尔运算 非

5. 表达式的使用

运算符 说明
+
-
*
/
% 取模
^或** 乘方
++x 在返回x变量之前, x加1
x++ 返回x变量后,x加1
$ awk ‘BEGIN{var=2;var1="hello";print var,var1}‘
2 hello
$ awk ‘BEGIN{var=2;var1=3.5;print var+var1}‘
5.5
$ awk ‘/^$/{sum++}END{print sum}‘ passwd # 统计空行的数量 sum 没有初始化赋值,默认为0
$ awk ‘/root/{sum++}END{print sum}‘ passwd # 统计包含root的行的数量

awk编程的内容极多,这里只罗列简单常用的用法,更多请参考 http://www.gnu.org/software/gawk/manual/gawk.html

Shel编程之awk

标签:end   正式   dmi   ||   输出   简单   lock   mon   pattern   

原文地址:https://www.cnblogs.com/itgiser/p/14533776.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!