如果某些文件中包含空格,我如何让awk在ls -l
中输出整个文件名。通常,我可以运行此命令:
ls -l | awk '{print $9}'
如果文件中包含空格,则无效。是否有可能以某种方式打印$ 9,$ 10,$ 11等?
答案 0 :(得分:33)
更好的解决方案:首先不要尝试解析ls输出。
irc.freenode.org #bash频道的官方维基解释了为什么这是一个坏主意,以及您可以采取哪些替代方法: http://mywiki.wooledge.org/ParsingLs
使用find,stat和类似工具将提供您正在寻找的功能而没有陷阱(并非所有这些都是显而易见的 - 有些仅在迁移到具有不同ls实现的平台时发生)。 / p>
对于您的具体示例,我猜您正在尝试仅查找当前目录中的文件(而不是目录);使用ls -l
的当前实现是错误的,因为它排除了具有+ t或setuid权限的文件。实现这一目标的正确方法如下:
find . -maxdepth 1 -type f -printf '%f\n'
答案 1 :(得分:3)
刚刚完成。它也可以用sed:
完成# just an exercise in regex matching ...
ls -l | sed -E -e '1d; s/^([^ ]+ +){8}//'
答案 2 :(得分:2)
如果您仍然坚持使用ls -l而不是find或其他工具,这是我的解决方案。它不漂亮且具有破坏性:
ls -l | awk '{for (i = 1; i < 9; i++) $i = ""; sub(/^ */, ""); print}'
答案 3 :(得分:1)
可能有更好的方法涉及以某种方式组合字段,但是:
$ echo 1 2 3 4 5 6 7 8 9 10 11 12 13 14... | awk '{for (i = 9 ; i <= NF ; i++) printf "%s ", $i}' 9 10 11 12 13 14...
使用printf "%s " $i
将打印第i个字段后面的空格,而不是换行符。 for循环只是说从第9个字段到最后一个字段。
答案 4 :(得分:1)
echo 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
awk 'BEGIN {OFS=ORS=""} ; {for (i=9;i<NF;i++) print $i " "; print $NF "\n"}'
答案 5 :(得分:1)
解决方案是编码&amp;使用sed:
使用单词或字符解码空格ls -l | sed s/\ /{space}/ | awk '{print $9}' | sed s/{space}/\ /
这将在将{space}
行中的所有空格替换为awk之前替换它。在该行传递给awk之后,我们用空格替换{space}
。
find
是一个更好的解决方案。但如果你真的必须使用awk,你可以试试这个。
答案 6 :(得分:1)
ls -l | awk -v x=9 '{print $x}'
我使用它来获取目录的文件名而不会发生意外。如果你不确定文件类型,我注意到找到的解决方案是好的和花花公子,如果你知道你在看ls -l工作得很好,它也按字母顺序排序。
答案 7 :(得分:0)
如果您对文件名感兴趣,那么不要解析 ls -l
输出并使用 ls -1
(数字 one,而不是小写的 L! )。它只是每行输出一个文件名。
$ touch foo 'bar with spaces' baz
$ ls -1
bar with spaces
baz
foo