【问题标题】:Cut and Awk command : Delimiter behaviourCut 和 Awk 命令:分隔符行为
【发布时间】:2012-12-28 18:50:58
【问题描述】:

我尝试使用 cut 命令从“ls -l”命令输出中获取文件名列表及其大小。

$ ls -l | cut -f 5,9 -d " "

它给了我基于“单一空白”作为分隔符的输出。当“ls -l”输出在某些行中包含连续空格时,该命令的输出不适用于这些行。 只有单个空格作为列分隔符的行会给出正确的输出。

当我运行以下命令时:

$ ls -l | awk '{ print $5"\t"$9 }'

awk 忽略多个空格并从“ls -l”输出中正确提取列。 而 cut 将每个空格视为分隔符,将值放在错误的列中。

它为所有行提供正确的输出。

为什么会这样?我可以用 cut 命令做什么来解决这个问题?

【问题讨论】:

  • 知道了。不同之处在于 AWK 可以使用多个字符作为分隔符进行拆分。而 CUT 只能使用单个字符作为分隔符进行拆分。

标签: linux awk


【解决方案1】:

awk 在空格上分割字段。 cut 在分隔 字符 上分割字段。 awk 是解决这个问题的更好工具。

作为替代方案,您可以将ls -l 导入到一个实用程序中,该实用程序可以压缩多个空格字符(可能是tr -s),也可以导入一个用单个空格字符替换多个空格字符的实用程序(可能是sed)。 然后 cut 会做你想做的事。

【讨论】:

    【解决方案2】:

    Don't parse ls -- 如果包含空格,您的代码将不会打印完整的文件名。要获取文件大小和名称,请使用stat:

    stat -c "%s %n" *
    

    【讨论】:

    • 谢谢@Glen。您简洁答案中的链接非常有用。
    【解决方案3】:

    试试这个?:

    ls -l | tr -s ' ' | cut -d ' ' -f 5, 9 
    

    【讨论】:

    • 它不会删除所有出现的“ ”吗?
    • 谢谢。我会尽力让你知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2020-09-27
    • 2016-05-03
    • 2018-05-21
    • 1970-01-01
    • 2021-05-14
    • 2010-10-25
    相关资源
    最近更新 更多