linux-awk命令

目录

AWK介绍

基础语法

1.awk命令格式

2.选项参数

3.内建变量

4.awk脚本命令

5.awk脚本常规模式

5.1 正则表模式

5.2 比较模式

5.3 运算模式

5.4 范围模式

5.5 特殊模式

6.控制语句

6.1 if-else

6.2 while

6.3 for

示例记录

统计netstat各tcp链接状态数量


AWK介绍

Linux中的AWS主要用于处理文本文件,标准化输出文本文件。Linux中默认自带的是gawk,兼容awk、nawk。

  • awk--其命名是由三位创始人的Family Name首字母组成(Alfred Aho,Peter Weinberger,Brian Kernighan)。
  • nawk--“New AWK”,AT&T版本实验室的AWS升级版。
  • gawk--“GNU AWK”,Linux中默认自带的版本。也是功能最强大,社区最活跃的版本。和awk、nawk完全兼容。
  • mawk--Ubuntu和Debian Linux上默认的awk,执行速度最快的版本。

基础语法

1.awk命令格式

awk [选项参数] 'awk脚本命令' 文件

2.选项参数

选项参数 说明
-F [fs] 指定分隔符,fs可以是一个字符串或者正则表达式。不指定fs默认用空格分隔。
-v var=value 自定义变量。例:awk -v a=111 '{print $1,$2,a}'
-f filename 从文件中读取awk脚本。

-o

--pretty-print

将awk脚本输出到指定文件,如果不指定则输出到当前目录的awkprof.out文件。

3.内建变量

变量 说明
$n 第n个字段,字段由FS分隔。
$0 完整的输入记录。
$NF 最后一个字段,字段由FS分隔。
NF 一条记录,按FS分隔后的字段数目
NR 行号(已读出的记录数),从1开始。
FS 字段分隔符,默认是空格。
RS 记录(行)分隔符,默认是换行符。
OFS

输出字段分隔符,默认与输入字段分隔符(FS)一致。

例:awk 'OFS="-" {print $1,$2}'

ORS 输出记录(行)分隔符,默认是换行符。
FNR 多个文件分别计数的行。
FILNAME 当前文件名。
ARGC 命令行参数数目。
ARGV 命令行参数数组。
IGNORECASE 如果是真,则忽略大小写匹配。

4.awk脚本命令

awk脚本命令主要分为三段:BEGIN{command}、/pattern/ {command} 、END{command}

awk 'BEGIN{command} /pattern/ {command} END{command}' file
  • BEGIN{command} -- 执行程序启动时执行的代码,整个过程中只执行一次。可缺省。
  • /pattern/ {command} -- /pattern/模式匹配,按字符串或正则匹配行,匹配成功后才执行{command},且/pattern/可缺省。
  • END{command} -- 执行程序结束时执行的代码。可缺省。

5.awk脚本常规模式

5.1 正则表模式

正则匹配以字符串root开头的行,输出第1个字段。

awk '/^root/ {print $1}' /etc/passwd

5.2 比较模式

匹配第3个字段的值大于400的行,输出第1和第3字段。

awk '$3>400 {print $1 $3}' /etc/passwd

正则匹配第7个字段以bash结尾,输出第1和第7字段。

awk -F':' '$7~"bash$" {print $1 $7}' /etc/passwd

5.3 运算模式

awk -F':' '{print $1+1,$2+1}' file

5.4 范围模式

awk -F':' '/root/,/sys/ {print $1 $3}' file

5.5 特殊模式

BEGIN/END 仅在awk执行后或者结束前执行。

6.控制语句

6.1 if-else

#单分支
'{if (判断条件) {执行语句}}'
'{if (判断条件) 执行语句}'

#双分支
'{if (判断条件) {执行语句} else {执行语句}}'
'{if (判断条件) 执行语句;else 执行语句}'

#多分支
'{if (判断条件) {执行语句} else if (判断条件) {执行语句} else {执行语句}}'
'{if (判断条件) 执行语句;else if (判断条件) 执行语句;else 执行语句}'

判断/etc/passwd中用户名是root的则输出"root,admin"。其他则正常输出用户名。

awk -F':' '{if ($1=="root") {print $1,"admin"} else {print $1}}' /etc/passwd

6.2 while

i=0;while (判断条件i<2) {执行语句;i++}
awk -F':' '{i=0;while(i<2){print $1;i++}}' /etc/passwd

6.3 for

for (变量 in 数组) {执行语句}
for (变量;条件;表达式) {执行语句}

统计/etc/passwd中各解析器的用户数

awk -F: 'status[$NF]++ END{for (A in status) {print A, status[A]}}' /etc/passwd

示例记录

统计netstat各tcp链接状态数量

netstat -tan | awk '/^tcp/{status[$NF]++} END{for (A in status) {print A,status[A]}}'

你可能感兴趣的:(#,Linux命令,linux,运维)