awk'{print $ 9}'最后一个ls -l列,包括文件名中的任何空格

时间:2009-09-19 05:09:48

标签: bash awk

如果某些文件中包含空格,我如何让awk在ls -l中输出整个文件名。通常,我可以运行此命令:

ls -l | awk '{print $9}'

如果文件中包含空格,则无效。是否有可能以某种方式打印$ 9,$ 10,$ 11等?

8 个答案:

答案 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或其他工具,这是我的解决方案。它不漂亮且具有破坏性:

  1. 通过for循环
  2. 将它们设置为“”来销毁$ 1 .. $ 8
  3. 在$ 9之前留下一堆空格,使用sub()命令
  4. 删除它们
  5. 打印剩下的
  6. 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