分页: 1 / 1

新手求教一个关于awk的简单脚本

发表于 : 2011-03-02 19:55
NewUserFF
我的目的是搜索~/music下面的所有mp3文件,并显示出第一个mp3文件,我想用awk实现,因此我这样做:

代码: 全选

file=$(find ~/music -name *.mp3)
field=$(awk -F '^M' '{print $1}' "${file}")
结果是显示出了所有的mp3文件,我把 -F '^M' 改成 -F ' ' ,结果依旧,非常纳闷,我的感觉是:file这个变量里面有无数个mp3文件路径,每个路径占一行,那么只要用回车(^M)分割,就可以得到第一行,但结果不是这样,我试了下

代码: 全选

echo ${file}
结果显示的是一片mp3路径

代码: 全选

1.mp3 2.mp3 3.mp3
中间只有空格,而我设想的结果应该是这样的

代码: 全选

1.mp3
2.mp3
3.mp3
我非常奇怪,find找到的东西不是一行一行的吗?怎么echo后居然变成以空格分割了?以空格分割也行,但是-F ' '不管用,为什么,我的代码错在哪里呢?
先谢谢大家啦!

Re: 新手求教一个关于awk的简单脚本

发表于 : 2011-03-02 21:12
astolia
NewUserFF 写了:我非常奇怪,find找到的东西不是一行一行的吗?怎么echo后居然变成以空格分割了?
你没加引号shell自然不会分行显示

代码: 全选

echo "${file}"
实际上你的问题是在于没有弄清楚awk中Records和Fields的概念,所以你再怎么通过-F设置Fields,仍然是将换行符作为每个记录的分隔符
还有就是你该用 echo xxx| awk这种方式,awk xxx这种方式是处理xxx这个文件

代码: 全选

field=$(echo "${file}" | awk 'BEGIN{RS="";FS="\n"}{print $1}')
最后一点是,find ~/music -name *.mp3 | head -1 不就完事了吗

Re: 新手求教一个关于awk的简单脚本

发表于 : 2011-03-03 12:13
NewUserFF
楼上的大侠,虽然我还是怎么弄懂,不过十分感谢你的回答!我再琢磨一下

Re: 新手求教一个关于awk的简单脚本

发表于 : 2011-03-03 13:43
trigger
shell里面不要老想着用变量,用管道

Re: 新手求教一个关于awk的简单脚本

发表于 : 2011-03-03 13:48
trigger
find的输出结果保存进了变量$file
$file展开是一个长字符串,你的写法awk会认为该字符串是当前目录下的一个文件名,显然找不到这个文件