awk用法记录

awk 简介

awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具。数据可以来自标准输入、一个或多个文件,或其它命令的输出。
awk的处理文本和数据的方式:逐行扫描文件,默认从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger
gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。
下面介绍的awk是以GNU的gawk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍

User’s Guide 站点: https://www.gnu.org/software/gawk/manual/gawk.html

使用

命令模式

awk [options] 'commands' file(s)
	option 部分
		-F 定义字段分割符号,默认的分隔符是空格
		-v 定义变量并赋值
 
	command 部分:
	'范围说明或正则表达式或者{awk命令语句1;awk命令语句2;...}'
 
	'BEGIN{} {}         END{}'
	 行处理前      行处理 	行处理后
 
	1、范围说明部分可以是BEGIN、END、逻辑表达式或者为空
	2、awk命令语句间用分号间隔
	3、引用shell变量需用双引号引起
 
# 举例:
awk '/root/' /etc/passwd
awk 'NR==1' /etc/passwd
awk 'NR==1{print $1}' /etc/passwd

脚本模式

awk [options] -f scriptfile file(s)
特点:
1、awk脚本是awk命令的清单
2、命令需要用分号间隔
3、#号开头的是注释行
4、#!/bin/awk -f 

工作原理

# awk -F: '{print $1,$3}' /etc/passwd
(1)awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符(RS)结束

(2)然后,行被:(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始。

(3)awk如何知道用空格来分隔字段的呢? 因为有一个内部变量FS来确定字段分隔符。初始时,FS赋为空格

(4)awk打印字段时,将以设置的方法使用print函数打印,awk在打印的字段间加上空格,因为$1,$3之间
有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符OFS,OFS默认为空格

(5)awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔
成字段并进行处理。该过程将持续到所有行处理完毕

基本应用

$0	:表示当前所有记录
$1,$2,$3...$n:awk中用该顺序形式表示files中每行以间隔符号分割的各列的不同字段
注:
awk默认以空格符为间隔符号将每行分割为单独的字段,也可以使用awk内置变量FS定义间隔符号
# awk -F: '{print $1,$7}' a.txt
# awk 'BEGIN{FS=":"} {print $1,$7}' a.txt
 
NF  		表示当前记录的字段数(列数)
$NF		最后一列
$(NF-1)	倒数第二列
FNR/NR	行号
FILENAME 文件名
"\t"		制表符
"\n"		换行符
""			打印字符串
FS 		    定义间隔符,命令里定义。如‘BEGIN{FS=":"}’
OFS  		定义"输出字段"的分隔符,默认是空格
RS			输入记录分割符,默认换行(即\n)
ORS		    输出记录分割符,默认换行(即\n)
print 	    打印函数
 
awk -F: 'NR==2{print $1,$(NF-1)}'
 
格式化输出:
print函数		类似echo
# date |awk '{print "Month: "$2 "\nYear: "$NF}'
# awk -F: '{print "username is: " $1 "\t uid is: "$3}' /etc/passwd
 
 
printf函数		类似echo -n
# awk -F: '{printf "%-15s %-10s %-15s\n", $1,$2,$3}'  /etc/passwd
# awk -F: '{printf "|%15s| %10s| %15s|\n", $1,$2,$3}' /etc/passwd
# awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd
 
%s 字符类型
%d 数值类型
占15字符
- 表示左对齐,默认是右对齐
posted @ 2020-01-27 22:38  jun's  阅读(197)  评论(0编辑  收藏  举报