【问题标题】:How can I cat output of a system("pwd") with text in awk?如何使用 awk 中的文本对系统(“pwd”)的输出进行分类?
【发布时间】:2014-03-21 18:20:38
【问题描述】:

请多多包涵,因为我对 shell 脚本和 awk 还很陌生。我一直在尝试创建一个播放列表来在 Mplayer 中播放我的一些音乐,但它只有在指定每个文件的完整路径时才有效。我一直在尝试设置一个小 shell 脚本来在每个文件名之前插入 $pwd 的输出并将其写入播放列表,如下所示:

ls | awk '{system("pwd") | getline x; grep -v 0; gsub("\n",""); print x"/"$1}' > playlist.txt

(grep 是为了去掉 system("pwd") 输出的“0”状态)。但是,x 中有一个换行符,所以我得到了输出

/home/(directory)
/Song_1.mp3
/home/(directory)
/Song_2.mp3

而我想要的是

/home/(directory)/Song_1.mp3
/home/(directory)/Song_2.mp3

【问题讨论】:

标签: linux shell awk


【解决方案1】:

正如其他人回答的那样,还有其他方法可以获取 OP 中请求的完全限定路径。

对于那些将 Awk 用于其他目的并需要工作目录的人,Awk 可以通过 ENVIRON 数组访问环境变量。您可以通过ENVIRON["PWD"]访问它。

该目录是完全限定的,因此请求的/home/(directory)/filename.mp3 可能无法按预期工作。即便如此,单线应该适用于 OP 的目的:

ls -1 | awk '{ print(ENVIRON["PWD"] "/" $0); }' > playlist.txt

【讨论】:

    【解决方案2】:

    你可以像这样使用printf

    printf "%s\n" "$PWD"/*
    

    或者你的 awk:

    printf "%s\n" * | awk 'BEGIN{"pwd"|getline d} {print d "/" $0}'
    

    【讨论】:

    • 引用$PWD ("$PWD"/*),也许它可能会被更强烈地推荐为唯一的良好实践方法。
    【解决方案3】:

    不使用 awk 或其他任何东西,但我认为这可以满足您的需求?

    find -printf "\"$PWD/%f\"\n"
    

    【讨论】:

    • 你为什么要在 find "$PWD" -print 上使用它(它也更便携,而 -printf 是一个 GNU 扩展)?
    • 因为它可以很好地处理带空格的文件名?
    • 不会比find "$PWD" -print 更好,不会。
    • ...对于目录名称中包含 % 的任何人来说都是不幸的。
    • 很抱歉这么久才把这个话题复活,但是之前工作忙就放弃了,现在才重新开始。这正是我想要的,谢谢!
    【解决方案4】:

    您是否正在尝试这样做?

    ls -1 ${PWD}/*.mp3
    

    find "${PWD}" -maxdepth 1 -name "*.mp3" -print
    

    for f in ${PWD}/*.mp3
    do
      echo "${f}"
    done
    

    【讨论】:

    • ls -1 方法是不好的做法,应该这样标记。另外,扩展$PWD时需要更多引号。
    • ...虽然find -print 也是不好的做法(POSIX 文件名可以包含换行符,因此不能在换行符分隔的列表中安全地表示),但毕竟是学位级别。
    • 取决于它是创建一个供人类阅读的输出列表,还是用于进一步处理。如果输出用于进一步处理,请绝对避免使用ls 方法...
    【解决方案5】:

    你也可以

    find $(pwd) -maxdepth 1
    

    【讨论】:

    • $(pwd) 是不必要的低效——为什么要生成一个子shell 只是为了获取当前目录? "$PWD" 是一种更有效的检索该值的方法。此外,需要引号,否则当当前目录名称包含空格时它将不起作用。
    猜你喜欢
    • 2015-10-03
    • 2016-01-11
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2015-08-21
    • 2014-12-26
    • 2016-05-25
    • 1970-01-01
    相关资源
    最近更新 更多