awk 命令
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk 命令相关的知识,希望对你有一定的参考价值。
AWK是linux下对文本及数据进行扫描处理,数据可以来自标准输入、文件、管道。把文件中读取到的每一行的每个字段分别进行格式化,而后进行显示;支持使用变量、条件判断、循环、数组
awk [options] ‘script‘ FILE ...
awk [options] ‘/pattern/{action}‘ FILE ...
AWK有两处特殊的模式:GEGIN和END,被放置在没有读取任何数据之前以及在所有数据读取完后执行
模式:
地址定界:/pat1/,/pat2/
/pattern/
!/pattern/ 取反匹配的
BEGIN:执行前的做准备工作
END: 执行后的收尾工作
awk -F: ‘BEGIN{print "UserName:\n------------"}$3>500{print $1}END{print "---------------"}‘ /etc/passwd
awk ‘BEGIN {FS=":"}$3>=500{print $1}‘ /etc/passwd ### 执行前把分隔符改为冒号
1、AWK的分隔符与记录字段
(a)、分隔符:
输入分隔符:
行分隔符 默认是$符、字段分隔符 默认是空白。
输出分隔符:
行分隔符 默认是$符、字段分隔符 默认是空白。
如果想修改默认的分隔符,可以通过-F指定,或在BEGIN重新对FS进行赋值。
# awk ‘BEGIN{FS = ":"}{print $1}‘ /etc/passwd
# awk -F : ‘{print $1}‘ /etc/passwd
# echo ‘hello world:is work‘ | awk -F "[:, ]" ‘{print $3}‘ \\ 指定多个分隔符
(b)、记录字段:
AWK以分隔符把从文件中读取一条记录,记录在$0中,分割后的多个字段分别存储在$1....$NF,字段的个数为NF。
# awk -F : ‘{print $1}‘ /etc/passwd \\ 输出该文件的第一个字段
# awk -F : ‘{print $NF}‘ /etc/passwd \\ 输出该文件的最后一个字段
# awk -F : ‘{print NF}‘ /etc/passwd \\ 输出该文件的字段的个数
2、awk内置变量
ARGC:命令行参数的个数
FILENAME:当前输入文档的名称
FNR:输入文件的当前记录编号,当有多个文档时有用
NR:输入流的当前记录编号
NF:字段数,可以说最后一个字段
FS: 读入行时使用的字段分隔符,默认为空白
OFS: 输出时使用字段分隔符,默认为空白
ORS:输出记录分隔符,默认为换行\n
RS:输入记录分隔符,默认为换行\n
3、表达式与操作符
+
-
*
/
%
^ 幂运算
--
++
+=
-=
/=
<
>
<=
>=
==
!= 不等于
~ 匹配
!~ 不匹配
&& 与
|| 或
# awk -F : ‘$3>500{print $1,$3}‘ /etc/passwd
# awk -F : ‘$NF~/bash$/{print $NF}‘ /etc/passwd
# awk ‘/^$/ {x+=1} END {print x}‘ /etc/rc.d/init.d/functions
72
*****************高级应用**********************************
1、if条件判断
格式:
if (表达式) 动作1; else动作2
awk -F : ‘{if ($3>500) print $1,"user";else print $1,"ADMIN"}‘ /etc/passwd
2、while循环
格式1:
while (条件) 动作
# awk ‘i=1 {} BEGIN { while (i<=10) {++i;print i}}‘
格式2:
do 动作 while (条件)
# awk ‘BEGIN { do {++x;print x} while (x<=10)}‘
3、for循环
格式:
for (变量;条件;计数器)
动作
# awk ‘BEGIN{for(i=1;i<=10;i++) print i}‘
4、break与contiue
for (i=1;i<=10;i++) { if (i=5) continue \\ 这里用contiue,当符合条件时就会跳出循环,只有=5时不会打印,换成break则只会打印4行。 print i }
5、函数
getline函数
作用,从输入中读取下一行内容,从下面df -h 输出结果可以看出,有的剩余余量在第3列,有的在第4列,这样只有通过判定NF字段数来截获数据,如果遇到NF为1的可以通过getline函数跳过当前行。
[[email protected] ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_system-root \\ 一行 29G 1.9G 26G 7% / tmpfs 504M 0 504M 0% /dev/shm /dev/sda1 194M 27M 158M 15% /boot /dev/mapper/vg_system-var \\一行 20G 584M 18G 4% /var
[[email protected] ~]# df -h | awk ‘{if(NF==1){getline;print $3};if(NF==6)print $4}‘
26G
504M
158M
18G
练习:
1、显示GID小于500的组;
# awk -F : ‘$3<500{print $1}‘ /etc/group
# awk -F : ‘BEGIN{print "group name\n============="}$3<500{print $1}‘ /etc/group
2、显示默认shell为nologin的用户;
# awk -F : ‘$7~/nologin$/{print $1}‘ /etc/passwd
3、显示eth0网卡文件的配置信息,注意,只显示等号后面的值;
# awk -F = ‘{print $2}‘ /etc/sysconfig/network-scripts/ifcfg-eth0
4、显示/etc/sysctl.conf文件中定义的内核参数;只显示名称;
# awk -F = ‘!/^#|^$/{print $1}‘ /etc/sysctl.conf
# awk -F = ‘/^[^#]/{print $1}‘ /etc/sysctl.conf
5、显示eth0网卡的ip地址;通过ifconfig的命令结果进行过滤
# ifconfig eth0 | awk ‘/inet addr/{print $2}‘ | awk -F: ‘{print $2}‘
本文出自 “菜鸟日志” 博客,请务必保留此出处http://zkxfoo.blog.51cto.com/1605971/1757506
以上是关于awk 命令的主要内容,如果未能解决你的问题,请参考以下文章