awk的工作模式
awk是一个文本处理工具,通常用于处理数据并生成结果报告
语法格式
第一种形式
awk 'BEGIN{}pattern{commands}END{}' file_name
语法格式 | 解释 |
---|---|
BEGIN | 正式处理数据之前 |
pattern | 匹配模式 |
{commands} | 匹配命令,可能多行 |
END | 处理完所有匹配数据后执行 |
第二种形式
standard output | awk 'BEGIN{}pattern{commands}END{}'
awk的内置变量
内置变量 | 含义 |
---|---|
$0 | 整行内容 |
$1-$n | 当前行的第1-n个字段(按照指定分隔符分割后) |
NF(Number Field) | 当前行的字段个数,也就是多少列 |
NR(Number Row) | 当前行的行号,从1开始计数 |
FNR(File Number Row) | 多文件处理时,每个文件行号单独计数,都是从0开始 |
FS(Field Separator) | 输入字段分割符。不指定默认以空格或者Tab键分割 |
RS(Row Separator) | 输入行分割符。默认回车\n |
OFS(Output Field Sepatator) | 输出字段分割符。默认为空格 |
ORS(Output Row) | 输出行分隔符。默认为回车 |
FILENAME | 当前输入的文件名字 |
ARGC | 命令行参数个数 |
ARGV | 命令行参数数组 |
看一下/etc/passwd文件的内容
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
输出文件的每行内容
awk '{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
输出第二列内容
需要指定分隔符:
awk 'BEGIN{FS=":"}{print $2}' /etc/passwd
x
x
x
不需要指定分割符,默认空格,tab键,多个也可以分隔(如一个空格+一个tab键)
show.txt文件内容如下
# 空格分隔
python java php
# tab键分隔
flink hadoop storm
awk '{print $1}' show.txt
输出如下:
python
flink
输出每一行有多少列
awk '{print NF}' show.txt
输出如下
3
3
可以用这个输出每一行的最后一列的值
awk '{print $NF}' show.txt
输出行号
awk '{print NR}' show.txt
输出如下(没有混合使用,例子比较简单)
1
2
对每个文件的行号单独计数
awk '{print FNR}' show.txt /etc/passwd
同时指定行分隔符和列分隔符
show.txt的文件内容如下
python|java|php--flink|hadoop|storm
先输出每一行数据
awk 'BEGIN{RS="--"}{print $0}' show.txt
输入如下
python|java|php
flink|hadoop|storm
输出每一行的第二列
awk 'BEGIN{RS="--";FS="|"}{print $2}' show.txt
输出如下
java
hadoop
在上面基础上指定行分隔符
awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $2}' show.txt
输出如下
java&hadoop&
再次指定列分隔符
awk 'BEGIN{RS="--";FS="|";ORS="&";OFS="@@"}{print $1,$2}' show.txt
输出如下
python@@java&flink@@hadoop&
输出文件名字
show.txt的文件内容如下
python|java|php
flink|hadoop|storm
awk '{print FILENAME}' show.txt
输入如下,因为是对行进行处理,所以有几行,输出几次文件名
show.txt
show.txt
awk 格式化输出之printf
printf的格式说明符
格式符 | 含义 |
---|---|
%s | 打印字符串 |
%d | 打印十进制数 |
%f | 打印一个浮点数 |
%x | 打印十六进制数 |
%o | 打印八进制数 |
%e | 打印数字的科学计数法形式 |
%c | 打印单个字符的ASCII码 |