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"}’