文本三剑客之AWK

awk原理

  • 是一种文本处理工具

  • 加载一行处理一行

awk命令格式:

1.awk [选项]   '表达式  {处理动作}' 文件1  文件2 ……

   满足表达式就处理,不满足表达式就不处理

2.awk -f  脚本文件   文件1  文件2……

awk选项:

-F : 指定分隔符

-v : 指定变量

表达式:

awk的语言的表达式

1.不写就没有效果

2.找到特定的行

处理动作:

print 打印

printf 打印

计算:100+200

awk '{print $n}'                      以空格为分隔符,取第n列

awk -F: '{print $n}'                 以冒号为分隔符 取第n列

awk内置变量

awk 内置变量和设立了环境中 的变量会有冲突,所以用'{  }'

         如:awk '{print $2}'     以空格为分隔符取第二列

语法:awk [选项] '模式{处理动作 }'

如果模式为空,则每一行都要处理

模式:

  • FS :列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同

  • OFS:决定输出时的分隔符

  • RS: 决定行分隔符,RS=":" 指定冒号为行分隔符。

  • NF:当前处理的行的字段个数

    示例:倒数第二列:$(NF-1)

    倒数第一列:$(NF)

  • NR:显示行号

         示例:NR==2,只显示第二行

         awk 'NR==2{print $1}'

  • $0:当前处理的行的整行内容

  • $n:当前处理行的第n个字段(第n列)

    $0:一整行或者一整列

    $1:第一列

    $2:第二列

  • FILENAME:显示处理的文件名

关系表达式

关系表达式结果为真才会被处理

真:结果为非0值,非空字符串

假:结果为空字符串或0值

seq 10|awk 'i=!i' 奇数行

seq 10|awk '!(i=!i)'偶数行

条件判断

awk [选项] '模式{条件判断}'

案例题:

1.NR==1,NR==4取区间行

 awk -F: "NR==1,NR==4 {print $1}'  /etc/passwd

'NR==1,NR==4 {print $1}'           取1-4行的第一列

2.打印所有/etc/passwd所有用户名(根据-F指定分隔符)

     cat /etc/passwd|awk -F":" '{print $1}'

-F":"                   以冒号作为分隔符

print  $1             打印出第一列

3.打印磁盘已使用情况,去除%

df|awk '{print $5}'|awk -F% '{print $1}'

df|awk -F"[ %]+" '{print $5}'

df|awk -F"( |%)+" '{print $5}'

实例题:

1.找到10点到11点之间的日志

awk '/10:00/,/11:00/{print $0}'

2.删除test里重复的行

awk '!a[$0]++' test

3.统计/etc/fstab文件中每个文件系统类型出现的次数

cat /etc/fstab |awk '^[^#]/{print}' |awk '{print $3}' |sort |uniq -c

'/^[^#]/          提取不以#开头的行

$3                提取第三个字段

sort              排序

uniq -c          去重并统计次数

4.统计出/etc/fstab文件中每个真单词出现的次数

grep -o "\b[a-zA-Z]+\b" /etc/fstab

"\b[a-zA-Z]+\b"              以aA为开头到以zZ为结尾的整字符

+                                    代表一个以上的字符

5.提取出字符串Yd$C@MO5MB%9&Bdh7dq+YVixp3vpw中的所有数字

echo "Yd$C@MO5MB%9&Bdh7dq+YVixp3vpw" |grep -o [0-9]

  grep -o [0-9]              只输出匹配的内容,0-9的数字全部显示

6.提取主机名并放入原文件 test.txt

http://mail.kgc.com/index.html http://www.kgc.com/test.html http://study.kgc.com/index.html http://blog.kgc.com/index.html http://www.kgc.com/images/logo.jpg http://blog.kgc.com/20080102.html http://www.kgc.com/images/kgc.jpg

第一种写法:

cat test |awk -F"[/ .]+" '{print $3}' >>test

"[.  /]"        以  .  或   /  为分隔符

$3             取第三个字段 

第二种写法:

cat test |cut -d "/" -f3|cut -d "." -f1

7.查出/tmp/的权限,以数字方式显示

stat /tmp/|awk -F"[(/]" 'NR==4{print $2}'

8.查出用户UID最大值的用户名、UID及shell类型

cat /etc/passwd |sort -t: -n -k3 |tail -n1

你可能感兴趣的:(linux,运维,服务器)