【问题标题】:Unix - How do you pass / pipe the output of a sed command to a ls command in UnixUnix - 如何在 Unix 中将 sed 命令的输出传递/管道到 ls 命令
【发布时间】:2018-02-28 02:12:43
【问题描述】:

我可以使用以下命令确定输入文件的大小:

ls -l employee.txt | awk '{print $5}'

这将只打印文件大小。

而且我可以打印文件的内容,而忽略文件的第一行和最后一行(指标题和尾部)。下面的命令对我有用:

sed '1d;$d' employee.txt

但是如何将这两个命令结合起来,使其确定文件的大小,而忽略标题和尾部。同时头和尾不应从输入文件中删除。

我可以通过编写两条语句来实现这一点。将完整文件复制到一个新文件中,除了标题和尾部,然后对新文件执行 ls 如下:

sed '1d;$d' employee.txt > employee1.txt

ls -l employee1.txt

我尝试在下面的单个语句中执行此操作,但无济于事。任何输入都会有所帮助。

sed '1d;$d' employee.txt | ls -l employee.txt

ls -l `sed '1d;$d' employee.txt`

sed '1d;$d' employee.txt |xargs ls -l $1

【问题讨论】:

    标签: unix sed ls


    【解决方案1】:

    Don't parse ls 获取文件大小。要获取磁盘上文件的大小,请使用stat -c '%s' filename,或者要获取字符流的大小,请使用wc -c

    # size of employee.txt
    stat -c '%s' employee.txt
    
    # size without header and footer
    sed '1d;$d' employee.txt | wc -c
    

    【讨论】:

    • sed 选项与 wc 看起来好多了。如果您不介意,您能否详细解释一下 stat -c 和 wc -c 一般有什么区别?
    • stat 仅适用于文件。 wc 可以处理文件或从 stding 读取文本(即当它位于管道的右侧时)
    【解决方案2】:

    你可以通过

    cat someFilename.txt | wc -c
    

    第一个命令输出文件的内容,第二个命令计算输入的大小。

    这不会删除标题和尾部。为此,您可以像以前一样使用“sed”命令。

    【讨论】:

      【解决方案3】:

      我认为你以错误的方式处理这个问题。

      我的建议:使用“stat”命令查询文件总大小:

      stat --format=%s employee.txt 
      

      您可以将结果存储在这样的变量中(假设您正在运行 Bash shell):

      fileSize="$(stat --format=%s employee.txt)"
      

      现在您检索第一行(再次假设 Bash shell):

      firstLine="$(head -n 1 employee.txt)"
      

      接下来您检索最后一行(再次假设 Bash shell):

      lastLine="$(tail -n 1 employee.txt)"
      

      现在计算第一行和最后一行的大小,然后从文件大小中减去:

      echo "Total adjusted size is:" $((fileSize - ${#firstLine} - ${#lastLine}))
      

      【讨论】:

      • 感谢您的建议@JScottMiller 但恐怕没有人会使用此选项
      • @JKC,请详细说明,您是要在脚本中使用它还是仅用于一次性使用?在前一种情况下,我强烈建议在后一种情况下使用我的建议,如果您不习惯编程,其他版本可能更合适。
      • 我将只在脚本中使用它,您的选项太长而且没有多大帮助。我们可以只用一个或两个衬垫来实现这一点。
      • @JKC,请记住,“wc”解决方案会计算文件中的所有字符,而基于统计的解决方案只是从文件系统中查询这些信息。
      • 是的@JScottMiller。那么,当我只用一条语句就可以达到我的要求时,为什么还要做这么多的统计语句呢?请让我知道您的回答比格伦杰克曼的回答更有效 - sed '1d;$d' employee.txt | wc -c
      猜你喜欢
      • 1970-01-01
      • 2013-10-23
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多