awk命令拷屏
如果不指明采取什么动作,awk默认打印出所有浏览出的记录,与{print $}是一样的
模式和动作两者是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。
默认情况下,每一个输入行都是一条记录,但用户可通过RS变量指定不同的分隔符进行分隔。 awk 指令由模式、操作或者模式与操作的组合组成。
模式是由某种类型的表达式组成的语句。如果某个表达式中没有出现关键字 if ,但实际在计算时却暗含 if 这个词,那么这个表达式就是模式。
操作由括在大括号中的一条或多条语句组成,语句之间用分号或者换行符隔开。
分号常用在命令行上,换行符常用在脚本文件里。
模式不能括在大括号中,模式由包括在两个正斜杠之间的正则表达式、一个或多个 awk 操作符组成的表达式组成。 awk 是一种用于读取和处理结构化数据(如系统的 /etc/passwd 文件)的极佳工具。
模式动作的语法
awk 通过判断模式(Pattern)的值来决定是否执行其后对应的动作(Actions)。 pattern模式为主
###匹配每行第5个字段以4,开头的行
[root@-shiyan dev]# cd /dev
[root@-shiyan dev]# ll|awk '$5~/^4,/' ###匹配每行第3个字段为0的行
[root@-shiyan sh]# ps -ajx|awk '$3~/^0$/'
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2./FAQ
? - S : [kthreadd]
? - S : [migration/]
? - S : [ksoftirqd/]
? - S : [migration/]
[root@-shiyan sh]# ps -ajx|awk '$3!~/^0$/'
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2./FAQ
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
? - Ss : /sbin/init
? - S<s : /sbin/udevd -d
? - S<sl : auditd
? - Ss : rpcbind [root@-shiyan awk]# cat grade.txt
M.Tansley / Green
J.Lulu / green
P.Bunny / Yellow
J.Troll / Brown-
L.Tansley / Brown-
###模式可以是以下任意一个:
/正则表达式/:使用通配符的扩展集。
关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$>%1选择第二个字段比第一个字段长的行。
模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。
BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。BEGIN是awk 的保留字,是一种特殊的模式。所以在BEGIN{ Actions} 语法中
END:让用户在最后一条输入记录被读取之后发生的动作。END是awk 的保留字,也是一个特殊的模式。
在Unix awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。
任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。
复合表达式最好用小括号括起来。
fgy@fgy-QTH6:~$ awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
daemon
bin
sys
sync
games
man
lp
news 以上介绍的模式计算后结果为一逻辑值(True or False)。awk 各个逻辑值间可通过&&(and),||(or),!(not) 结合成一个新的逻辑值,
所以可以将不同的逻辑值通过上述结合符号来结合成一个新的模式,这样可进行复杂的条件判断。 ###/正则表达式/:使用通配符的扩展集。
[root@-shiyan awk]# cat pa.awk
/^(L|P)/
[root@-shiyan awk]# awk -f pa.awk grade.txt
P.Bunny / Yellow
L.Tansley / Brown-
[root@-shiyan awk]# cat pa.awk
/^(L|P)/
/[uo]l/
[root@-shiyan awk]# awk -f pa.awk grade.txt
J.Lulu / green
P.Bunny / Yellow
J.Troll / Brown-
L.Tansley / Brown- ###关系表达式和正则表达式混合的模式
[root@-shiyan awk]# cat pa.awk
$ ~ /^[-]$/
[root@-shiyan awk]# awk -f pa.awk grade.txt
M.Tansley / Green
J.Lulu / green ###关系表达式:可以用运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$>$1选择第二个字段比第一个字段长的行。
[root@-shiyan awk]# cat pa.awk
$ > && $ <
[root@-shiyan awk]# awk -f pa.awk grade.txt
J.Troll / Brown-
L.Tansley / Brown- ###模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。
[root@-shiyan awk]# cat pa.awk
$ == , $ ==
[root@-shiyan awk]# awk -f pa.awk grade.txt
J.Lulu / green
P.Bunny / Yellow
J.Troll / Brown- ###BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
BEGIN and END patterns cannot have missing action parts.
###END:让用户在最后一条输入记录被读取之后发生的动作。awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后执行这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。 ###空格的话,输出是相连的
[root@-shiyan awk]# cat pa.awk
/[uo]l/ {print $ $}
[root@-shiyan awk]# awk -f pa.awk grade.txt action操作为主
操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份:
变量或数组赋值
输出命令
内置函数
控制流命令 ###
[root@-shiyan awk]# cat pa.awk
$ ~ /^[-]$/ {print $ + }
[root@-shiyan awk]# awk -f pa.awk grade.txt ###
[root@-shiyan awk]# cat pa.awk
$ == "Brown-3" {print $}
[root@-shiyan awk]# awk -f pa.awk grade.txt ###
[root@-shiyan awk]# cat pa.awk
{print ($ > ? "ok "$: "error "$)}
[root@-shiyan awk]# awk -f pa.awk grade.txt
ok
error
ok
error
error 模式与操作组合为主
###加逗号,输出是以空格分隔的
[root@-shiyan awk]# cat pa.awk
/[uo]l/ {print $,$}
[root@-shiyan awk]# awk -f pa.awk grade.txt ###统计空白行
[root@-shiyan awk]# cat blank
BEGIN { x= }
/^$/ { x=x+ }
END { print "I found " x " blank lines. :)" }
[root@-shiyan awk]# awk -f blank /etc/logrotate.conf
I found blank lines. :)
###统计某个文件夹下的文件占用的字节数,排除4096大小的文件
[root@250-shiyan awk]# cat pa.awk
BEGIN{size=0;print "[start] size is ", size}
{if($5!=4096){size+=$5;print size}}
END{print "[end] size is ", size}
[root@250-shiyan awk]# ll|awk -f pa.awk
[start] size is 0
0
86
1441
1485
1716
1847
[end] size is 1847
###
shell#snmpwalk -v 2c -c flt123 192.168.2.250 hrSWRunPerfMem|sed '/: 0 KB/d'|cut -d " " -f4|awk '{s+=$1}END{print s}'
.txt内容如下 shell#cat .txt |awk '{(list1+=$1)(list2+=$2)(list3+=$3)(list4+=$4)}END{print list1,list2,list3,list4}' shell#awk '{col1+=$1;col2+=$2;col3+=$3;col4+=$4}END{print col1,col2,col3,col4}' file 以下三行同一结果,其中一些细节有差异而已。统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹):
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size+=$5;}} END{print "[end] size is ", size}'
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size+=$5;}} END{print "[end] size is ", size/1024/1024,"M"}'
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}' [root@-shiyan log]# cat messages-|awk '/(STOP)|(error)/' 匹配出现STOP或者error的行
[root@-shiyan log]# more messages-|awk '/13/' 打印出任何域包含13的记录
[root@-shiyan log]# more messages-|awk '$2~/13/' 打印出第二个域包含13的记录
[root@-shiyan log]# more messages-|awk '$2!~/13/' 打印出第二个域不包含13的记录
[root@-shiyan log]# more messages-|awk '$3=="10:16:04"' 精确匹配
[root@-shiyan log]# more messages-|awk '/[Gg]reen/' 匹配大小写
[root@-shiyan log]# more messages-|awk '$3~/^...4/' 打印第3域中第四个字符是4的记录,^行首,.任意字符
[root@-shiyan log]# cat cron-|awk '/(Anacron)|(Job)/'使用|时,语句需要括起来,或关系
[root@-shiyan log]# echo $PWD | awk -F/ '{print$NF}' 打印目录名
action可以有多个语句,每个语句间用分号隔开,注意每个语句都是一个/pattern/{action}。
###一个动作里有两个语句。形如://{//{gsub(..)};//{print $0}
[root@-shiyan awk]# cat >pa.awk
{gsub(//,);print $}
[root@-shiyan awk]# awk -f pa.awk grade.txt
M.Tansley / Green
J.Lulu / green
P.Bunny / Yellow
J.Troll / Brown-
L.Tansley / Brown- ###标准的一套模式与动作语法。这是个标准的/pattern/{action}写法
[root@-shiyan awk]# cat >pa.awk
gsub(//,){print $}
[root@-shiyan awk]# awk -f pa.awk grade.txt
J.Troll / Brown- ###这是两套模式与动作,用分号隔开,第一个省略动作,第二个省略模式。形如:/gsub()/{print $};//{print $0}
[root@-shiyan awk]# cat >pa.awk
gsub(//,);
{print $}
[root@-shiyan awk]# awk -f pa.awk grade.txt
M.Tansley / Green
J.Lulu / green
P.Bunny / Yellow
J.Troll / Brown-
J.Troll / Brown-
L.Tansley / Brown-
awk的赋值比较
[root@-monitor ~]# lsof -c rpcbind|awk '/mem/'|awk '(to+=$7);END{print "FD total: " to}'
rpcbind rpc mem REG , /lib64/libnss_files-2.12.so
rpcbind rpc mem REG , /lib64/libc-2.12.so
rpcbind rpc mem REG , /lib64/libpthread-2.12.so
rpcbind rpc mem REG , /lib64/libdl-2.12.so
rpcbind rpc mem REG , /lib64/libgssglue.so.1.0.
rpcbind rpc mem REG , /lib64/libnsl-2.12.so
rpcbind rpc mem REG , /lib64/libtirpc.so.1.0.
rpcbind rpc mem REG , /lib64/libwrap.so.0.7.
rpcbind rpc mem REG , /lib64/ld-2.12.so
FD total:
####列出FD是mem的列,将其大小列相加并输出
[root@-monitor ~]# lsof -c rpcbind|grep mem|awk '{to+=$7};END{print "total: " to}'
total: 2656728
####将123列相加,并输出
[root@84-monitor ~]# size /usr/bin/ab|tail -1|awk '(a=$1+$2+$3);{print a}'
45491 2072 15848 63411 f7b3 /usr/bin/ab
63411
action可以有多个语句,每个语句间用分号隔开,注意每个语句都是一个/pattern/{action}。 END是awk 的保留字,也是一个特殊的模式。
模式可以是其中之一
关系表达式
正则表达式等
复合表达式最好用小括号括起来。 这是两套模式与动作,用分号隔开,第一个省略动作,第二个是标准的模式与动作
awk '(to+=$7);END{print "FD total: " to}'
awk的管道与重定向
[root@250-shiyan ~]# lsof -c rpcbind|grep mem|awk '{print $7,$8 > "rpcmem"}'
[root@250-shiyan ~]# cat rpcmem
65928 260640
1921216 260624
142640 260648
19536 260630
36584 261105
113432 260634
162016 261107
40792 260725
154520 260617 只能有一个管道,系统命令用双引号括起来。
一般默认的sort都是按照字母的ASCII进行排序的,现在想按照数字的大小进行排序
对第一列按照大小排序sort -n [root@-shiyan ~]# lsof -c rpcbind|grep mem|awk '{print $7|"sort"}' [root@-shiyan ~]# lsof -c rpcbind|grep mem|awk '{print $7|"sort -n"}' 默认sort是以空格或者tab键分隔字段,如果是其它的就加上-t ","之类的分隔符
对第二列按照大小排序sort -n -k2
[root@-shiyan ~]# lsof -c rpcbind|grep mem|awk '{print $7,$8}' [root@-shiyan ~]# lsof -c rpcbind|grep mem|awk '{print $7,$8|"sort -n -k2"}'
过滤出3月31日9点到12点的日志,grep需要两条命令
grep -E "Mar 31 0[89]:" messages > efieji
grep -E "Mar 31 1[012]:" messages > wefef
下面这个命令是有问题的,它不能达到纯过滤3月31日9点到10点的日志。
grep -E "Mar 31 09:|10:" messages
下面这条可以一次达到目的,三条命令的进化过程,思考过程由简单到复杂,命令由复杂到简单。
awk -F "]" '$1~/Mar 31 09:|Mar 31 1[012]:/{print $0}' messages >iii
awk '/Mar 31 (09:|10:|11:|12:)/' messages >oooo
awk '/Mar 31 (09:|1[012]:)/' messages >uuu
awk命令拷屏的更多相关文章
- sed命令拷屏
http://blog.sina.com.cn/s/blog_45497dfa0100w6r3.html sed样例较多,可以参考 http://blog.sina.com.cn/s/blog_6d ...
- ceph命令拷屏
常用命令ceph -w ceph df ceph features ceph fs ls ceph fs status ceph fsid ceph health ceph -s ceph statu ...
- rbd_rados命令拷屏
mimic或者luminous rbd_rados sudo mount -t ceph 192.168.7.151:6789:/ /mnt -o name=admin,secret=AQBaPZNc ...
- linux awk命令详解
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
- awk命令详解
搜索 纠正错误 添加实例 awk 文本和数据进行处理的编程语言 补充说明 awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件 ...
- Linux安全基础:awk命令的使用
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- AWK命令学习
使用方法 awk 'pattern {action}' {filenames} 尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到 ...
- awk 命令
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- AWK命令的用法
1.awk命令简介: awk是一种可以处理数据.产生格式化报表的语言,功能十分强大. awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个 ...
随机推荐
- socket.io 入门教程
转载自:http://deadhorse.me/nodejs/2011/12/29/socket.io_induction.html socket.io socket.io是一个以实现跨浏览器.跨平台 ...
- linux常用命令:3文件搜索命令
文件搜索命令 1. 命令名:find 命令所在路径:/bin/find 执行权限:所有用户 语法:find [搜索范围] [匹配条件] 功能描述:文件搜索 文件搜索类型 通过文件名搜索 -name ...
- 如何去除内联元素(inline-block元素)之间的间距(转载)
如何去除内联元素(inline-block元素)之间的间距 前几天写一个专题页 div{width:900px;}div a{ display:inline-block; width:300px; ...
- EF中逆变和协变
EF中的增删改查: 实现步骤: 1.声明一个EF的上下文. bjhksjEntities dbContext = new bjhksjEntities(); 2.声明一个实体. HKSJ_USERS ...
- Unity C#和OC互相调用
Unity 两种方式 一般都是组合使用 1.[DllImport("__Internal")] C#调用oc 2.UnitySendMessage oc调用C# ...
- 一个简单的tr:hover效果
昨天,搞项目的时候,在一个小问题上卡了40分钟,现在想想,还是平时比较少去注意一些细节,经过这次,一定要去多注意细节了. 好了废话不多说,我现在说明下遇到的问题,一个表格中,要求是当鼠标滑过每一行时, ...
- HDU 3047
http://acm.hdu.edu.cn/showproblem.php?pid=3047 和hdu 3038以及poj那个食物链一样,都是带权并查集,此题做法和hdu 3038完全相同,具体操作看 ...
- I.MX6 KEY_ROW4 can't as GPIO pin
/********************************************************************** * I.MX6 KEY_ROW4 can't as GP ...
- MyBatis日期有坑
使用MyBatis时,可能会遇到日期格式的时间段问题,当数据库的时间为DATE类型时,MyBatis的jdbcType应该使用DATE,否则,有时间会出现莫名的数据找不到的问题,具体原因,可以查看源码 ...
- Day03_JAVA语言基础第三天
1.位运算符 1.面试题(掌握) ^:一个数据对同一个数据^两次,结果还是数据本身 举例:a ^ b ^ b = a 2.注意 知道结论,面试题,以后就完全不用看了 2.逻辑运算符(掌握) ...