shell编程三剑客之awk
- 一 awk工具简介
- 二 awk工具的作用
- 三 awk语法格式
-
- 3.1 awk常用内部变量
- 3.2 常用内部变量举例
- 四 awk使用进阶
-
- 4.1 1. 格式化输出print和printf
- 4.2 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进行介绍。
二 awk工具的作用
1.awk用来处理文件和数据的,是类unix下的一个工具,也是一种编程语言
2.可以用来统计数据,比如网站的访问量,访问的IP量等等
3.支持条件判断,支持for和while循环
三 awk语法格式
awk 选项 ‘命令部分’ 文件名
注意:
引用shell变量需用双引号引起
常用选项介绍:
-F 定义字段分割符号,默认的分隔符是空格
-v 定义变量并赋值
3.1 awk常用内部变量
变量 | 变量说明 | 备注 |
---|---|---|
$0 | 当前处理行的整行内容 | |
$1,$2,$3…$n | 文件中每行以间隔符号分割的不同字段 | awk -F: ‘{print $1,$3}’ |
NF | 当前处理行的字段个数 | awk -F: ‘{print NF}’ |
$NF | 最后一列 | $(NF-1)表示倒数第二列 |
FNR/NR | 当前处理行的行号 | |
FS | 定义间隔符 | ‘BEGIN{FS=":"};{print $1,$3}’ |
OFS | 定义输出字段分隔符,默认空格 | ‘BEGIN{OFS="\t"};print $1,$3}’ |
RS | 输入记录分割符,默认换行 | ‘BEGIN{RS="\t"};{print $0}’ |
ORS | 输出记录分割符,默认换行 | ‘BEGIN{ORS="\n\n"};{print $1,$3}’ |
3.2 常用内部变量举例
# awk -F: '{print $1,$(NF-1)}' 1.txt
# awk -F: '{print $1,$(NF-1),$NF,NF}' 1.txt
# awk '/root/{print $0}' 1.txt
# awk '/root/' 1.txt
# awk -F: '/root/{print $1,$NF}' 1.txt
root /bin/bash
# awk -F: '/root/{print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash
# awk 'NR==1,NR==5' 1.txt
# awk 'NR==1,NR==5{print $0}' 1.txt
# awk 'NR==1,NR==5;/^root/{print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
四 awk使用进阶
4.1 1. 格式化输出print和printf
print函数 类似echo "hello world"
# 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
awk 'BEGIN{FS=":"};{printf "%-15s %-15s %-15s\n",$1,$6,$NF}' a.txt
%s 字符类型 strings %-20s
%d 数值类型
占15字符
- 表示左对齐,默认是右对齐
printf默认不会在行尾自动换行,加\n
4.2 awk变量定义
# awk -v NUM=3 -F: '{ print $NUM }' /etc/passwd
# awk -v NUM=3 -F: '{ print NUM }' /etc/passwd
# awk -v num=1 'BEGIN{print num}'
1
# awk -v num=1 'BEGIN{print $num}'
注意:
awk中调用定义的变量不需要加$