免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1787 | 回复: 7
打印 上一主题 下一主题

请教一个关于awk的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-27 12:44 |只看该作者 |倒序浏览
我希望用awk打印一个文件中的第x行到底y行(x和y的值不确定),如下语句:
假设当前x和y的值分别为2和4
#x=2
#y=4
#awk 'BEGIN {num1="'$x'";num2="'$y'";} {if (NR>=num1 && NR<=num2) print $0}' /var/log/messages
输出的结果和预期的不一致,预期结果应该是/var/log/messages文件中的第2到第4行,但是实际输出的结果远远不止这些。
不知道上面这条语句哪里出了问题?

而如果在awk中不引用变量则是正常的。
#awk '{if (NR>=2 && NR <=4) print $0}' /var/log/messages

所以,怀疑问题出在变量的引用方面,但是原体原因不知道,对awk不是很熟悉。。。。

论坛徽章:
0
2 [报告]
发表于 2010-11-27 12:57 |只看该作者
awk -v num1=$x -v num2=$y '{}'

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2010-11-27 13:01 |只看该作者
  1. $ export x=2
  2. $ export y=4
  3. $ awk 'BEGIN{num1=ENVIRON["x"];num2=ENVIRON["y"]}{if(NR>=num1 && NR<=num2) print $0}' /var/log/messages
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-11-27 13:03 |只看该作者
  1. $awk -v num1=$x -v num2=$y '{if(NR>=num1 && NR<=num2) print $0}' /var/log/messages
复制代码

论坛徽章:
0
5 [报告]
发表于 2010-11-27 13:24 |只看该作者
非常感谢。问题已解决,解决方法如rpbear 和L_kernel 所说,使用-v定义变量。

不知道我用的那种引用变量的方法会有问题呢?

论坛徽章:
0
6 [报告]
发表于 2010-11-27 13:28 |只看该作者
x和y是shell定义的变量不是awk定义的,所以再awk里面没法用,你需要传递给awk,一种就是如你所见的用-v传递,这样传递的变量在输入还没读取的时候,也就是在BEGIN里就能用。还有一种是这样

awk '{}' a=123 b=456 input
这样传递的参数再BEGIN不能用,只有在获取输入开始后才可以使用,就是这区别
回复 5# weiyonghz

论坛徽章:
0
7 [报告]
发表于 2010-11-27 13:36 |只看该作者
我写的语句,在输入文件内容简单的情况下,好像输出结果也是正常的,如下是两个例子:
输入文件内容:
#cat file001
aaa aaa aaaa
bbb bbb bbbbbb
ccc ccccc cccccccccc
dd dd ddddd ddd
eeeee eeeeeeeeeeeeeee

例1:输出x行到y行的内容(x=2,y=4)
#echo $x
2
#echo $y
4
#awk 'BEGIN {num1="'$x'";num2="'$y'";} {if (NR>=num1 && NR<=num2) print $0}' file001
bbb bbb bbbbbb
ccc ccccc cccccccccc
dd dd ddddd ddd

例2:打印第1个域,并在第1个域的前面增加test字符
# str="test"
# awk 'BEGIN {arg="'$str'"} {print arg$1}' file001
testaaa
testbbb
testccc
testdd
testeeeee

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2010-11-27 15:50 |只看该作者
向awk传递变量,可以使用两种方式。

一种是使用-v定义。

另一种是是用export变为环境变量,然后在awk中使用ENVIRON引用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP