答疑解惑:

为什么用awk取IP的时候用$4?
ifconfig eth0 | awk -F '[ :]+' 'NR==2{print $4}'
IP第二行内容如下:
inet addr:10.0.0.41 Bcast:10.0.0.255 Mask:255.255.255.0 # 因为分隔符-F的'+',表示将多个空格或冒号当成一个对待,此时大多数人都会认为$1是inet,
你不是说把多个空格当成一个,那就把前面的空格都去掉就ok么.实际情况是:
# 分隔符前后必须有内容,你把前面这么多空格当成一个,那它后面有字段,前面没字段,它去分割谁?
所以:以空格开头的(不管是一个还是多个)行,空格将是第一个字段.
echo " 1 2 3 4" | awk -F '[: ]+' '{print $1,$2}'
1

1.基本结构

awk BEGIN{coms}/pattern/{coms}END{coms}

开始模块 /找谁/{干什么} 结束模块

a.BEGIN和END模块最多各出现一次

b./找谁/{干什么},可以是多个,比如:

NR==2{print $1}NR==5{print $2}

2.常用内置变量

$0:当前记录,一整行;

$1,$2,$3...$n:第n个字段,字段由FS分隔;

FS(filed separator):输入字段分隔符,默认是空格;

OFS:输出字段分隔符,默认为空白字符;

cat test.txt
ABC:123:Jack
DEF:456:Alice
GHI:789:Amy
# 使用内置变量时,要使用-v选项来指定对应的变量
awk -v FS=":" -v OFS="=" '{print $1,$2}' test.txt

NF(number of filed):字段数,有多少字段,$NF代表最后一个字段;

NR(Number of Record):行号,从1开始;

FNR:当前输入文件的记录数目.

# 将/etc/passwd中第一行的第一个元素和第七个元素调换位置
awk -F ":" 'NR==1{print $7":"$2":"$3":"$4":"$5":"$6":"$1}' /etc/passwd
# 取出输出内容的第三行的倒数第二列
df -hT | awk 'NR==3{print $(NF-1)}'
#取/etc/passwd第10行到20行的第三列,写入到test.txt中
awk -F ":" 'NR>9 && NR<21{print $3}' /etc/passwd | cat -n
awk -F ":" 'NR>9 && NR<21{print $3}' /etc/passwd > test.txt # 用双引号不行

3.不常用内置变量

RS(Record Separator):输入记录分隔符(输入换行符),默认为换行符;

ORS(Out Record Separator):输出记录分隔符(输出换行符),指定输出时的换行符;

FILENAME:当前文件名;

ARGV:数组,保存的是命令行所给定的各参数;

ARGC:ARGC数组的个数.

# 遇见了RS指定的分隔符就换行
awk -v RS=":" '{print NR,$0}' test.txt
# 遇见了换行符就把\n替换成ORS指定的分隔符
awk -v ORS="---" '{print $0}' test.txt
ABC:123:Jack---DEF:456:Alice---GHI:789:Amy---[root@nfs01 ~]# awk 'BEGIN{print ARGV[0],ARGV[1],ARGV[2],ARGC}' a.txt b.txt
awk a.txt b.txt 3 # 自定义变量:
# 使用-v来自定义变量,-v varname=value
awk -v myVar="testvar" 'BEGIN{print myVar}'
# 在program中直接定义,定义变量和action之间需要用;隔开
awk 'BEGIN{myVar="testvar";print myVar}'

4.awk格式化:

# 先介绍一下printf
printf "%s\n" abc def ghi jkl
abc
def
ghi
jkl
printf "( %s )" 1 18 66;echo""
( 1 )( 18 )( 66 )
a.默认不会换行,如果需要,可以在"格式替换符"后加"\n"进行转义;
b."替换符"和"被格式化的文本"之间需要用"逗号"隔开;
c."替换符"和"被格式化的文本"得一一对应.
awk -v FS=":" 'BEGIN{printf "%-20s\t %s\n" , "User","UID"} {printf "%-20s\t %s\n" , $1,$3}' /etc/passwd
# "-"表示左对齐,不加默认右对齐
netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s \n",$1,$2,$3}'

5.模式:也就是条件,要找谁

# 关系运算符模式:
awk 'NR>3 && NR<6 {print $0}' /etc/passwd
# 正则模式:awk '/正则表达式/{print xx}' filename
awk '/\/bin\/bash$/{print $0}' /etc/passwd
# 当使用{x,y}类型次数匹配的正则表达式时,需要使用--posix选项或--re-interval选项
awk --posix '/hel{2,3}o/{print $0}' test3
hello
helllo
# 行范围模式:
# awk '/正则1/,/正则2/{动作}' filename
# 从被正则1匹配到的行开始,到被正则2匹配到的行结束,之间所有行都会执行对应的动作,
# 这种模式被称为行范围模式
# 想要从如下文本中找出,网卡1的地址在192.168.0.0、16网段的主机
cat test5
主机名 网卡1的IP 网卡2的IP
主机A 192.168.1.123 192.168.1.124
主机B 192.168.2.222 172.16.100.2
主机C 10.1.0.1 172.16.100.3
主机D 10.1.5.1 192.168.1.60
awk '$2~/192\.168\.[0-9]{1,3}\.[0-9]{1,3}/{print $1,$2}' test5

6.控制语句

# 必须用在{}中,且比较内容用()括起来
awk -F: '{if($1~/mail/) print $1}' /etc/passwd # 简写
awk -F: '{if($1~/mail/) {print $1}}' /etc/passwd # 全写
awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd
awk -F: 'NR!=1{if($3<500) {print $1,"Suser"} else {print $1,"Nuser"}}' /etc/passwd
awk 'BEGIN{for(i=1;i<=6;i++){print i}}'
# while循环是只有满足条件时才执行对应语句;
awk 'BEGIN{i=1;while(i<=6){print i;i++}}'
# do...while循环是无论是否满足条件,先执行一遍do对应的代码,
# 然后再判断是否满足while对应的条件,满足则执行do对应的代码;不满足则不执行.
awk 'BEGIN{i=1;do{print "hehe";i++}while(i<=5)}'

a.continue和break

# 注意这条命令中的括号,当i的值为3时,跳过当前循环:
awk 'BEGIN{for(i=1;i<=5;i++) {if (i==3){continue};print i}}'
#当i的值为3时,跳出整个循环:
awk 'BEGIN{for(i=1;i<=5;i++) {if (i==3){break};print i}}'

b.exit、next

# 如果没有在END模式使用exit,则直接跳出awk命令:
awk 'BEGIN{print 1;exit;print 2}'
# 如果在END模式中使用了exit,则直接执行END,跳过其它动作:
awk 'BEGIN{print "start";exit}{print $0}END{print "over"}' test5
# next让awk不对匹配到的行进行操作,直接处理下一行:
awk '{if (NR==2){next} print $0}' test5

c.条件、逻辑、数值

# 条件表达式
awk -F: '$1=="mysql"{print $3}' /etc/passwd
# 逻辑运算符
awk -F: '$1~/mail/ && $3>8 {print }' /etc/passwd # 逻辑与
awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd # 逻辑或
# 数值运算
awk -F: '/root|mail/{print $3+10}' /etc/passwd
10
18
21
# 这条命令为什么打印了三行,因为下面这条命令会匹配到三行
awk -F: '/root|mail/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

7.实际应用

应用1:
# 计算/etc目录下,普通文件的大小,使用KB作为单位
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",int(sum/1024),"KB"}'
应用2:
# 统计netstat -anp 状态为LISTEN和CONNECT的连接数量分别是多少?
netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s \n", i," ",sum[i]}'
应用3:
# 统计/etc目录下不同用户的普通文件的总数是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]++}END{for (i in sum) printf "%-6s %-5s %-3s \n",i," ",sum[i]}'
# 统计/etc目录下不同用户的普通文件的大小总size是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]+=$5}END{for (i in sum) printf "%-6s %-5s %-3s %-2s \n",i," ",sum[i]/1024/1024,"MB"}'
应用4:
# ftp|http|mysql的端口号是多少
awk -F "[ /]+" '$1~/^(ftp|http|mysql)$/{print $1,$2}' /etc/services | uniq
# ^http$:前后都加上,表示只查找指定内容,其实不加也行
# 计算/etc/services文件中的空行
grep -c "^$" /etc/services
awk '/^$/{a=a+1;print a}END{print a}' /etc/services
awk '/^$/{a=a+1}END{print a}' /etc/services
应用5:
cat test0
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
awk 'BEGIN{math=0;eng=0;com=0;printf "Lineno. Name No. Math English Computer Total\n";
printf "------------------------------------------------------------\n"}{math+=$3; eng+=$4; com+=$5;
printf "%-8s %-7s %-7s %-7s %-9s %-10s %-7s \n",NR,$1,$2,$3,$4,$5,$3+$4+$5}
END{printf "------------------------------------------------------------\n";
printf "%-24s %-7s %-9s %-20s \n","Total:",math,eng,com;
printf "%-24s %-7s %-9s %-20s \n","Avg:",math/NR,eng/NR,com/NR}' test0 Lineno. Name No. Math English Computer Total
------------------------------------------------------------
1 Marry 2143 78 84 77 239
2 Jack 2321 66 78 45 189
3 Tom 2122 48 77 71 196
4 Mike 2537 87 97 95 279
5 Bob 2415 40 57 62 159
------------------------------------------------------------
Total: 319 393 350
Avg: 63.8 78.6 70

参考linux awk详解:https://www.cnblogs.com/xudong-bupt/p/3721210.html

awk理论详解、实战的更多相关文章

  1. 3.awk数组详解及企业实战案例

    awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...

  2. (转)awk数组详解及企业实战案例

    awk数组详解及企业实战案例 原文:http://www.cnblogs.com/hackerer/p/5365967.html#_label03.打印数组:1. [root@nfs-server t ...

  3. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  4. awk命令详解二

    awk命令详解 简单使用: awk :对于文件中一行行的独处来执行操作 . awk -F :'{print $1,$4}'   :使用‘:’来分割这一行,把这一行的第一第四个域打印出来 . 详细介绍: ...

  5. shell编程之awk命令详解

    shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...

  6. 自学Zabbix9.2 zabbix网络发现规则配置详解+实战

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix9.2 zabbix网络发现规则配置详解+实战 1.  创建网络发现规则 Conf ...

  7. [PXE] Linux(centos6)中PXE 服务器搭建,PXE安装、启动及PXE理论详解

    [PXE] Linux(centos6)中PXE 服务器搭建,PXE安装.启动及PXE理论详解 本篇blog主要讲述了[PXE] linux(centos)PXE无盘服务器搭建,安装,启动及pxe协议 ...

  8. linux awk命令详解,使用system来内嵌系统命令, awk合并两列

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  9. Shell学习(五)—— awk命令详解

    一.awk简介   awk是一个非常好用的数据处理工具,相对于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个[字段]处理,因此,awk相当适合处理小型的数据数据处理.awk是一种报 ...

随机推荐

  1. centos 7 安装WordPress的参考博文

    安装方法: https://www.cnblogs.com/flankershen/p/7476415.html 安装完,测试不成功的解决办法: https://blog.csdn.net/u0104 ...

  2. Ubuntu 15 下 Qt 配置mysql链接及基本操作

    序 最近需要在Linux下做一个unix网络编程项目,选择了Ubuntu 最新版本15.04 : 开发环境:Qt 5 数据库: MySQL 安装Qt 和 MySQL 简要介绍一下软件的安装! 安装Qt ...

  3. emacs设置字体

    * C-h f set-default-font set-default-font is an alias for `set-frame-font' in `frame.el'. (set-defau ...

  4. joyoi tyvj1313 [NOIP2010初赛]烽火传递

    单调队列优化dp #include <iostream> #include <cstdio> using namespace std; int dp[1000005], n, ...

  5. 豆邮windows客户端(第三方)开发详解

    “豆邮”,是社区网站“豆瓣”的一个类似私信的功能模块.在豆瓣官网,“豆邮”曾一度被改为“私信”,但在遭到众多豆瓣用户的强烈反对之后又改了回来.然而,在豆瓣的移动客户端上,仍称呼为“私信”. 豆邮的设定 ...

  6. webdriver高级应用- 精确比较页面截图图片

    判断两张图是否完全一致,如果存在任何不一致,会认为图片不匹配,代码如下: #encoding=utf-8 from selenium import webdriver import unittest, ...

  7. 大数据学习——spark学习

    计算圆周率 [root@mini1 bin]# ./run-example SparkPi [root@mini1 bin]# ./run-example SparkPi [root@mini1 bi ...

  8. C语言变量长度在32位和64位处理器上的关系

    C语言变量长度在32位和64位处理器上的关系       理论上来讲 我觉得数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算).常用数据类型对应字节数 ...

  9. Oracle PL/SQL 语言(Procedural Language/SQL)

    Oracle PL/SQL 语言(Procedural Language/SQL)是结合了结构化查询与 Oracle 自身过程控制为一体的强大语言,PL/SQL 不但支持更多的数据类型,拥有自身的变量 ...

  10. WebSocket & websockets

    WebSocket & websockets https://en.wikipedia.org/wiki/WebSocket https://developer.mozilla.org/en- ...