linux shell awk命令的简单使用方法

awk命令

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域分隔符的情况下,默认的域分隔符是空格。

扫描二维码关注公众号,回复: 10717865 查看本文章

 

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


如果只是显示userinfo 的账户和账户对应的shell, 而账户与 shell 之间以逗号分割 , 而且在所有行添加列名 name,shell, 在最后一行添加 "nameend,shellend"

命令

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


printprintf

awk中同时提供了printprintf两种打印输出的函数。

其中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}'`



发布了35 篇原创文章 · 获赞 18 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Z_Dream_ST/article/details/79252435