1 awk是一个强大的文件分析工具
2 使用方法
awk '{pattern + action}' {filenames}
其中 pattern 表示 AWK 在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。pattern就是要表示的正则表达式,用斜杠括起来。
awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本
3 命令行方式
awk [-F field-separator] 'commands' input-file(s)
commands 是真正awk命令,[-F域分隔符]是可选的。input-file(s)是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
4 实例
编辑userinfo文件,文件内容为
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
命令:
cat userinfo | awk -F ':' '{print $1}'
root
daemon
bin
sys
sync
Games
$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键
所以$1表示账户
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
命令
cat userinfo | awk -F ':' '{print $1"\t"$7}'
root /bin/bash
daemon /bin/sh
bin /bin/sh
sys /bin/sh
sync /bin/sync
games /bin/sh
命令
cat userinfo | awk -F ':' 'BEGIN {print "user,shell"}{print $1","$7}END{print "userend,shellend"}'
user,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
sync,/bin/sync
games,/bin/sh
userend,shellend
awk中同时提供了print和printf两种打印输出的函数。
其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
搜索userinfo文件有root关键字的所有行,并显示对应的shell
命令
awk -F ':' '/root/{print $7}' userinfo
/bin/bash
这里指定了action{print $7}
新创建文件file,内容为
qwer = 123.456.123.456
asdf = 12:21:12:21:12:21
取出qwer=后面的值,取出asdf=后面的值,并将值转化为16进制
abc=$(grep -w 'qwer' file)
abc=${abc##*=}
echo $abc
idx=0
cache=$(grep -w 'asdf' file)
cache=${cache##*=}
while [ $idx -lt 6 ]
do
data=$(printf %02x ${cache%%:*})
cache=${cache#*:}
if [ $idx -eq 0 ]
then
def=$data
else
def="$def"":""$data"
fi
let "idx+=1"
done
echo def=$def
echo `grep -w 'asdf' file | awk -F '=' '{print $2}' | awk -F ':' '{printf "%02x:%02x:%02x:%02x:%02x:%02x", $1,$2,$3,$4,$5,$6}'`