菜鸟笔记
提升您的技术认知

awk 内置变量

阅读 : 2547

awk 内置变量

awk内置变量 作用
$0 代表目前awk所读入的整行数据。我们已知awk是一行一行读入数据的,$0就代表当前读入行的整行数据。
$n 代表目前读入行的第n个字段。比如,$1表示第1个字段(列),$2表示第2个字段(列),如此类推
NF 当前行拥有的字段(列)总数。
NR 当前awk所处理的行,是总数据的第几行。
FS 用户定义分隔符。awk的默认分隔符是任何空格,如果想要使用其他分隔符(如“:”),就需要FS变量定义。
ARGC 命令行参数个数。
ARGV 命令行参数数组。
FNR 当前文件中的当前记录数(对输入文件起始为1)。
OFMT 数值的输出格式(默认为%.6g)。
OFS 输出字段的分隔符(默认为空格)。
ORS 输出记录分隔符(默认为换行符)。
RS 输入记录分隔符(默认为换行符)。

awk常用统计实例

打印文件的第一列(域) :

 awk '{print $1}' filename
 ```

打印文件的前两列(域) :
```shell
 awk '{print $1,$2}' filename
 ```

打印完第一列,然后打印第二列 :
```shell
awk '{print $1 $2}' filename

打印文本文件的总行数 :

awk 'END{print NR}' filename

打印文本第一行 :

awk 'NR==1{print}' filename

打印文本第二行第一列 :

sed -n "2, 1p" filename | awk 'print $1'

获取第一列

ps -aux | grep watchdog | awk '{print $1}'

获取第一列,第二列,第三列

ps -aux | grep watchdog | awk '{print $1, $2, $3}'

获取第一行的第一列,第二列,第三列

ps -aux | grep watchdog | awk 'NR==1{print $1, $2, $3}'

获取行数NR

df -h | awk 'END{print NR}'

获取列数NF(这里是获取最后一行的列数,注意每行的列数可能是不同的)

ps -aux | grep watchdog | awk 'END{print NF}'

获取最后一列

ps -aux | grep watchdog | awk '{print $NF}'

对文件进行操作

awk '{print $1}' fileName

指定分隔符(这里以:分割)

ps -aux | grep watchdog |awk  -F':' '{print $1}'

超出范围不报错

ps -aux | grep watchdog | awk '{print $100}'

查询可以登录的用户的用户名和UID

cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"} {printf $1 "\t" $3 "\n"}’

这里“:”分隔符生效了,可是第一行却没有起作用,原来我们忘记了“BEGIN”条件,那么再来试试;

cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}’
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\t 行号:” NR "\t 字段数:" NF "\n"}’
#解释下awk命令
#开始执行{分隔符是“:”}{输出第一字段和第三字段输出行号(NR值)字段数(NF值)}
root     0      行号:1       字段数:7
user1   501     行号:2       字段数:7

如果我只想看看sshd这个伪用户的相关信息,则可以这样使用:

可以看到sshd 伪用户的UID是74,是/etc/passwd_文件的第28行,此行有7个字段

cat /etc/passwd | awk 'BEGIN {FS=":"} $1=="sshd" {printf $1 "\t" $3 "\t 行号:" NR "\t 字段数:" NF "\n"}’