linux之awk命令

Posted wuzm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux之awk命令相关的知识,希望对你有一定的参考价值。

一、awk的内置参数

$0:表示整个当前行

$1:每行第一个字段

$2:每行第二个字段

$n:每行第n个字段

awk的参数:分隔符

  -F separator 设定分隔符(默认为空格)  

打印单个字段:

awk -F ‘:‘ ‘print $3‘   /etc/passwd

打印多个字段:

awk -F ‘:‘ ‘print $1,$3‘  /etc/passwd

awk -F ‘:‘ ‘printf("User:%s      UID:%s\n", $1,$3)‘  /etc/passwd

awk -F ‘:‘ ‘print "User:" $1 "\t"UID:"$3"‘  /etc/passwd

  NR:每行行号

  NF:字段数量

awk -F ‘:‘ ‘print NR,NF,FILENAME‘ /ect/passwd

 

#案例:

1、显示/etc/passwd 中用户名ID大于100的行号和用户名

awk -F ":" ‘if ($3>100) print NR,$1‘ /etc/passwd

awk -F ":" ‘$3>100print NR,$1‘ /etc/passwd

2、在服务器的日志中找出IP:43.226.164.120 的访问日期。

sed -n ‘/43.226.164.120/p‘ assess_log | awk ‘ ‘ ‘print substr($4,2)‘ 

awk ‘/43.226.164.120/print substr($4,2)‘ assess_log

 

二、awk的逻辑判断式:

  • ~     匹配正则表达式
  • !~ 不匹配正则表达式
  • ==等于
  • !=不等于
  • < 小于
  • >大于

awk -F ‘:‘ ‘$1~/^m.*print $1‘ /etc/passwd   打印以m开头的用户名

awk -F ‘:‘ ‘$1!~/^m.*print $1‘ /etc/passwd  不打印以m开头的用户名

三、awk的扩展格式

command扩展

   BEGINprint "start"patternawk命令ENDprint "end"

#案例:制表显示/etc/passwd 每行的行号,每行的列数,对应行的用户名

awk -F ‘:‘ ‘BEGIN "User     Line    Col"print $1,NR,NFENDprint  "-------------"FILENAME"-------------"‘  /etc/passwd

#案例:统计当前文件夹下的文件/文件夹占用的大小

ls -al | awk ‘BEGINcount=0count+=$5ENDprint count‘

ls -al | awk ‘BEGINcount=0count+=$5ENDprint count/1024/1024"M"‘

#统计显示/etc/passwd的账户总人数

awk -F ‘:‘  ‘BEGINcount=0count++ENDprint count‘ /etc/passwd

awk -F ‘:‘  ‘BEGINcount=0$1!~/^$/count++ENDprint count‘ /etc/passwd 排除空行

#统计显示/etc/passwd中UID中大于100的用户名

awk -F ‘:‘  ‘$3>100print $1‘  /etc/passwd

awk -F ‘:‘ ‘BEGINcount=0$3>100user[count++]=$1ENDfor(i=0;i<count;i++) print i,user[i]‘  /etc/passwd

#统计access_log日志中每个IP出现的次数

awk ‘arr[$1]++ENDfor(key in arr)print key,arr[key]‘  access_log

 

 

awk和sed对比

1、awk和sed都可以处理文本

2、awk侧重于复杂逻辑处理

3、sed侧重于正则处理

4、awk和sed可以共同使用

 

面试问题

1、修改某个目录下所有包含AAA的文件的文件名  改为 aaa【改文件名】

find . -name "*aaa*"  -exec rename aaa AAA  \;

2、修改目录下所有的文件中,包含 aaa 都改成 AAA【改文件内容】

 sed -i  ‘s/AAA/aaa/g‘ `grep AAA -rl . `  反引号

sed本身不改变文件内容,要使用-i,然后看下文件

 

以上是关于linux之awk命令的主要内容,如果未能解决你的问题,请参考以下文章

Linux常用命令之awk

linux命令之awk

Linux系统命令三剑客之 awk

Linux常用基本命令:三剑客命令之-awk格式化动作

linux之awk命令

awk && sed ====linux 三剑客之awk 命令