linux的linux awk命令详解怎么这么难,完全看不懂!

有回复时邮件通知我新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 25, 距离下一级还需 175 积分
论坛徽章:0
huanghao@hh:~$ cat b
5%&&5&&6&&7
9%&&f& &e&&o
b文件的内容如上, 当我用awk '{printf $1}'&&b时,系统就会有个出错提示,如下
awk: run time error: not enough arguments passed to printf(&5%&)
& & & & FILENAME=&b& FNR=1 NR=1
如果换成$2,$3,$4就不会有这样的问题,可以顺利通过,难道时因为这个%?
巨富豪门, 积分 24925, 距离下一级还需 15075 积分
论坛徽章:0
HH_bird awk '{print $1}' b
5%
6%
awk '{printf $1}' b
5%6%复制代码centos 6& &
gawk-3.1.7-6.el6.i686
大富大贵, 积分 19185, 距离下一级还需 815 积分
论坛徽章:2
& & awk '{printf (&%s&,$1)}'
白手起家, 积分 25, 距离下一级还需 175 积分
论坛徽章:0
为什么要%s呢 其他就不需要?
大富大贵, 积分 14608, 距离下一级还需 5392 积分
论坛徽章:0
要用printf , 就按照printf的格式来写...&&
白手起家, 积分 2, 距离下一级还需 198 积分
论坛徽章:0
这个问题也遇到过,学习一下)& && && && & & &&&& &&&&&&&&&&&
大富大贵, 积分 19185, 距离下一级还需 815 积分
论坛徽章:2
& & 因为$1里有%,它被printf识别为格式符的一部分了
白手起家, 积分 25, 距离下一级还需 175 积分
论坛徽章:0
哦!&&受教了~~~:wink:
白手起家, 积分 44, 距离下一级还需 156 积分
论坛徽章:0
本帖最后由 asplinux 于
19:45 编辑
表示centos 6.2 正确识别,GNU Awk 3.1.7
不过楼主的写法是print的写法,不是printf的写法
白手起家, 积分 25, 距离下一级还需 175 积分
论坛徽章:0
啊 。。。我居然把print看成了printf。。。惭愧惭愧。。
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处linux awk命令基础 怎么在终端写_linux吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:188,998贴子:
linux awk命令基础 怎么在终端写收藏
我照着网上写的写不出来啊。净报错了,写不出来来,能不能一步一步的说说怎么在终端里写awk语言,说的通俗易懂的。最好举些实例。别跳着步骤说。新手请谅解。
阿里云云市场镜像可以一键部署云服务器所需要的运行环境和个性化的软件应用,满足建站,应用开发,可视化管理等个性化需求,linux镜像让云服务器&即开即用&.
居然还没有人回答,我们还能不能愉快的玩耍了
upup~hoho~ddddd
问问题也不会问, 你先把你写的awk命令 贴上来吧
登录百度帐号博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)[转]linux awk命令详解 - 旭东的博客 - 博客园
随笔 - 209, 文章 - 0, 评论 - 207, 引用 - 0
原文链接 :&
awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
awk处理过程:&依次对每一行进行处理,然后输出
awk命令形式:
awk [-F|-f|-v] &BEGIN{} //{command1; command2} END{}& file
&[-F|-f|-v]& &大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
' &' & & & & &引用代码块
BEGIN & 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// & & & & & 匹配代码块,可以是字符串或正则表达式
{} & & & & & 命令代码块,包含一条或多条命令
; & & & & &多条命令使用分号分隔
END & & &结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
$0 & & & & & 表示整个当前行
$1 & & & & & 每行第一个字段
NF & & & & &字段数量变量
NR & & & & &每行的记录号,多文件记录递增
FNR & & & &与NR类似,不过多文件记录不递增,每个文件都从1开始
\t & & & & & &制表符
\n & & & & & 换行符
FS & & & & &BEGIN时定义分隔符
RS&&&&&&&输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ & & & & & &匹配,与==相比不是精确比较
!~ & & & & & 不匹配,不精确比较
== & & & & 等于,必须全部相等,精确比较
!= & & & & & 不等于,精确比较
&&  & & 逻辑与
|| & & & & & & 逻辑或
+ & & & & & &匹配时表示1个或1个以上
/[0-9][0-9]+/ & 两个或两个以上数字
/[0-9][0-9]*/ & &一个或一个以上数字
FILENAME 文件名
OFS& & &&输出字段分隔符, 默认也是空格,可以改为制表符等
ORS& & & & 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]' & 定义三个分隔符
print &&$0
print&是awk打印指定内容的主要命令
awk '{print}' &/etc/passwd & == &&awk '{print $0}' &/etc/passwd &
awk '{print " "}'&/etc/passwd&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本
awk '{print "a"}' &&/etc/passwd&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//输出相同个数的a行,一行只有一个a字母
awk -F":" '{print $1}' &/etc/passwd&
awk -F: '{print $1; print $2}'&&&/etc/passwd &&&&&&&&&&&&&&&&&&//将每一行的前二个字段,分行输出,进一步理解一行一行处理文本
awk &-F: '{print $1,$3,$6}' OFS="\t" /etc/passwd&&&&& &&//输出字段1,3,6,以制表符作为分隔符
-f指定脚本文件
awk -f script.awk &file
{print $1} & & & & & & & //效果与awk -F":" '{print $1}'相同,只是分隔符使用FS在代码自身中指定
awk 'BEGIN{X=0} /^$/{ X+=1 } END{print "I find",X,"blank lines."}' test&
I find 4 blank lines.
&ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is",sum}' & & & & & & & & & &//计算文件大小
total size is 17487
-F指定分隔符
$1 指指定分隔符后,第一个字段,$3第三个字段, \t是制表符
一个或多个连续的空格或制表符看做一个定界符,即多个空格看做一个空格
awk -F":" '{print $1}' &/etc/passwd
awk -F":" '{print $1 $3}' &/etc/passwd & & & & & & & & & & &&//$1与$3相连输出,不分隔
awk -F":" '{print $1,$3}' &/etc/passwd & & & & & & & & & & & //多了一个逗号,$1与$3使用空格分隔
awk -F":" '{print $1 " " $3}' &/etc/passwd & & & & & & & & &//$1与$3之间手动添加空格分隔
awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd & & & //自定义输出 &
awk -F: '{print NF}' /etc/passwd & & & & & & & & & & & & & && & //显示每行有多少字段
awk&-F:&'{print $NF}' /etc/passwd & & & & & & & & & & & & && & //将每行第NF个字段的值打印出来
&awk -F: 'NF==4 {print }' /etc/passwd & & & & & & & & && && //显示只有4个字段的行
awk -F: 'NF&2{print $0}' /etc/passwd & & & & & & & & & & &&//显示每行字段数量大于2的行
awk '{print NR,$0}' /etc/passwd & & & & & & & & & & & & & &&&& &//输出每行的行号
awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd & & &//依次打印行号,字段数,最后字段值,制表符,每行内容
awk -F: 'NR==5{print}'&&/etc/passwd & & & & & & & & & & && &//显示第5行
awk -F: 'NR==5 || NR==6{print}' &/etc/passwd & & &&//显示第5行和第6行
route -n|awk 'NR!=1{print}' & & & & & & & & & & & & & & & & & &&& //不显示第一行
//匹配代码块
//纯字符匹配 & !//纯字符不匹配 &&~//字段值匹配 & &!~//字段值不匹配 & ~/a1|a2/字段值匹配a1或a2 &&
awk '/mysql/' /etc/passwd
awk '/mysql/{print }' /etc/passwd
awk '/mysql/{print $0}' /etc/passwd & & & & & & & & & //三条指令结果一样
awk '!/mysql/{print $0}' /etc/passwd & && & & & & & & //输出不匹配mysql的行
awk '/mysql|mail/{print}' /etc/passwd
awk '!/mysql|mail/{print}' /etc/passwd
awk -F: '/mail/,/mysql/{print}' /etc/passwd & & & & //区间匹配
awk '/[2][7][7]*/{print $0}' /etc/passwd & & & & & & & //匹配包含27为数字开头的行,如27,277,2777...
awk -F: '$1~/mail/{print $1}' /etc/passwd & & & & & //$1匹配指定内容才显示
awk -F: '{if($1~/mail/) print $1}' /etc/passwd & & //与上面相同
awk -F: '$1!~/mail/{print $1}' /etc/passwd & & & & &//不匹配
awk -F: '$1!~/mail|mysql/{print $1}' /etc/passwd & & & &
必须用在{}中,且比较内容用()扩起来
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 & & & & & &//if...else...
条件表达式
== & != & & & &= &
awk -F":" '$1=="mysql"{print $3}' /etc/passwd &
awk -F":" '{if($1=="mysql") print $3}' /etc/passwd & & & & &//与上面相同&
awk -F":" '$1!="mysql"{print $3}' /etc/passwd & & & & & & & & //不等于
awk -F":" '$3&1000{print $3}' /etc/passwd & & & & & & & & & & &//大于
awk -F":" '$3&=100{print $3}' /etc/passwd & & & & & & & & & &&//大于等于
awk -F":" '$3&1{print $3}' /etc/passwd & & & & & & & & & & & & &&&//小于
awk -F":" '$3&=1{print $3}' /etc/passwd & & & & & & & & & & & & //小于等于
逻辑运算符
awk -F: '$1~/mail/ && $3&8 {print }' /etc/passwd & & & & //逻辑与,$1匹配mail,并且$3&8
awk -F: '{if($1~/mail/ && $3&8) print }' /etc/passwd
awk -F: '$1~/mail/ || $3&1000 {print }' /etc/passwd & & & //逻辑或
awk -F: '{if($1~/mail/ || $3&1000) print }' /etc/passwd&
awk -F: '$3 & 100' /etc/passwd & &
awk -F: '$3 & 100 || $3 & 5' /etc/passwd &
awk -F: '$3+$4 & 200' /etc/passwd
awk -F: '/mysql|mail/{print $3+10}' /etc/passwd & & & & & & & & & &//第三个字段加10打印&
awk -F: '/mysql/{print $3-$4}' /etc/passwd & & & & & & & & & & & & & & //减法
awk -F: '/mysql/{print $3*$4}' /etc/passwd & & & & & & & & & & & & & & //求乘积
awk '/MemFree/{print $2/1024}' /proc/meminfo & & & & & & & & &//除法
awk '/MemFree/{print int($2/1024)}' /proc/meminfo & & & & & //取整
输出分隔符OFS
awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt & & & &
//输出字段6匹配WAIT的行,其中输出每行行号,字段4,5,6,并使用制表符分割字段
输出处理结果到文件
①在命令代码块中直接输出 &&&route -n|awk 'NR!=1{print & "./fs"}' &&
②使用重定向进行输出 & & & & &&route -n|awk 'NR!=1{print}' && ./fs
格式化输出
netstat -anp|awk '{printf "%-8s %-8s %-10s\n",$1,$2,$3}'&
printf表示格式输出
%格式化输出分隔符
-8长度为8个字符
s表示字符串类型
打印每行前三个字段,指定第一个字段输出字符串类型(长度为8),第二个字段输出字符串类型(长度为8),
第三个字段输出字符串类型(长度为10)
netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s \n",$1,$2,$3}'
netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-3s %-10s %-10s %-10s \n",NR,$1,$2,$3}'
awk -F: '{if($3&100) print "large"; else print "small"}' /etc/passwd
awk -F: 'BEGIN{A=0;B=0} {if($3&100) {A++; print "large"} else {B++; print "small"}} END{print A,"\t",B}' /etc/passwd&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //ID大于100,A加1,否则B加1
awk -F: '{if($3&100) else print}' /etc/passwd & & & & & & & & & & & & //小于100跳过,否则显示
awk -F: 'BEGIN{i=1} {if(i&NF) print NR,NF,i++ }' /etc/passwd &&
awk -F: 'BEGIN{i=1} {if(i&NF) {print NR,NF} i++ }' /etc/passwd
另一种形式
awk -F: '{print ($3&100 ? "yes":"no")}' &/etc/passwd&
awk -F: '{print ($3&100 ? $3":\tyes":$3":\tno")}' &/etc/passwd
awk -F: 'BEGIN{i=1} {while(i&NF) print NF,$i,i++}' /etc/passwd&
netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) print i,"\t",a[i]}'
netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) printf "%-20s %-10s %-5s \n", i,"\t",a[i]}'
9523 & & & & & & & & & & & & & & & 1 & &&
9929 & & & & & & & & & & & & & & & 1 & &&
LISTEN & & & & & & & & & & & & & &6 & &&
7903 & & & & & & & & & & & & & & & 1 & &&
3038/cupsd & & & & & & & & & 1 & &&
7913 & & & & & & & & & & & & & & & 1 & &&
10837 & & & & & & & & & & & & & & 1 & &&
9833 & & & & & & & & & & & & & & & 1 & &&
awk -F: '{print NF}' helloworld.sh & & & & & & & & & & & & & & & & & & & & & & &&&&& & & //输出文件每行有多少字段
awk -F: '{print $1,$2,$3,$4,$5}' helloworld.sh & & & & & & & & & & & & & & & &&//输出前5个字段
awk -F: '{print $1,$2,$3,$4,$5}' OFS='\t' helloworld.sh & & & & & & & & //输出前5个字段并使用制表符分隔输出
awk -F: '{print NR,$1,$2,$3,$4,$5}' OFS='\t' helloworld.sh & & & & & //制表符分隔输出前5个字段,并打印行号
awk -F'[:#]' '{print NF}' &helloworld.sh & & & & & & & & & & & & & & & & & & & & &&& &&& &//指定多个分隔符: #,输出每行多少字段
awk -F'[:#]' '{print $1,$2,$3,$4,$5,$6,$7}' OFS='\t' helloworld.sh & //制表符分隔输出多字段
awk -F'[:#/]' '{print NF}' helloworld.sh & & & & & & & & & & & & & & & & & & &&&&&& & &//指定三个分隔符,并输出每行字段数
awk -F'[:#/]' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12}' helloworld.sh & &&//制表符分隔输出多字段
计算/home目录下,普通文件的大小,使用KB作为单位
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",sum/1024,"KB"}'
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",int(sum/1024),"KB"}' & & & & //int是取整的意思
统计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]}'
统计/home目录下不同用户的普通文件的总数是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]++} END{for (i in sum) printf "%-6s %-5s %-3s \n",i," ",sum[i]}' &&
mysql & & & &199&
root & & & & & 374&
统计/home目录下不同用户的普通文件的大小总size是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]+=$5} END{for (i in sum) printf "%-6s %-5s %-3s %-2s \n",i," ",sum[i]/,"MB"}'
输出成绩表
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,printf "%-24s %-7s %-9s %-20s \n","Avg:",math/NR,eng/NR,com/NR}' test0
[root@localhost home]# cat test0&
Jack & & 45
Mike & & 95
awk手册http://www.chinaunix.net/old_jh/7/16985.html}

我要回帖

更多关于 linux awk命令详解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信