awk用法记录

Posted coolmark-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 文件名
"	"        制表符
"
"        换行符
""          打印字符串
FS          定义间隔符,命令里定义。如‘BEGIN{FS=":"}’
OFS         定义"输出字段"的分隔符,默认是空格
RS          输入记录分割符,默认换行(即
)
ORS         输出记录分割符,默认换行(即
)
print       打印函数
 
awk -F: 'NR==2{print $1,$(NF-1)}'
 
格式化输出:
print函数     类似echo
# date |awk '{print "Month: "$2 "
Year: "$NF}'
# awk -F: '{print "username is: " $1 "	 uid is: "$3}' /etc/passwd
 
 
printf函数        类似echo -n
# awk -F: '{printf "%-15s %-10s %-15s
", $1,$2,$3}'  /etc/passwd
# awk -F: '{printf "|%15s| %10s| %15s|
", $1,$2,$3}' /etc/passwd
# awk -F: '{printf "|%-15s| %-10s| %-15s|
", $1,$2,$3}' /etc/passwd
 
%s 字符类型
%d 数值类型
占15字符
- 表示左对齐,默认是右对齐

以上是关于awk用法记录的主要内容,如果未能解决你的问题,请参考以下文章

记录一些命令的用法(awk,sed,grep)

awk的简单用法

AWK的学习使用。

浅谈awk的基本用法

awk next以及getline用法示例

精通awk系列:awk用法入门