【问题标题】:extract a specific word in bash在bash中提取特定单词
【发布时间】:2013-05-18 17:46:23
【问题描述】:

我有以下表格中的一些行:

-rw-r--r-- sten/sefan anonymous 8593 2011-12-05 18:28 8M
-rw-r--r-- sten/sefan 8593 2011-12-05 18:28 8M

我怎样才能获得8593 one-liner?

通过执行一些dry-run 的档案来检索行,例如:

$ tar jtvf zip64support.tar.bz2 
-rw-r--r-- stefan.bodewig/Domain Users 16195018 2011-10-14 21:05 100k_Files.zip
-rw-r--r-- stefan.bodewig/Domain Users 14417258 2011-10-14 21:05 100k_Files_7ZIP.zip

或:

$ tar jtvf bla.tar.bz2 
-rw-r--r-- tcurdt/tcurdt   610 2007-11-14 18:19 test1.xml
-rw-r--r-- tcurdt/tcurdt    82 2007-11-14 18:19 test2.xml

具体是获取后面有YYYY-mm-dd的一行中的数字。

【问题讨论】:

  • 如果类似于ls 输出,那么您不应该解析它。数据来自哪里,提取的数字是什么意思?
  • 例如:$ tar jtvf bla.tar.bz2 -rw-r--r-- tcurdt/tcurdt 610 2007-11-14 18:19 test1.xml -rw-r--r- - tcurdt/tcurdt 82 2007-11-14 18:19 test2.xml
  • @yuwang 我建议您在问题中添加 tar 部分。因为您的示例让人认为它来自 ls 命令。
  • 更新了我的问题。谢谢

标签: linux bash sed awk cut


【解决方案1】:

获取当前目录中文件大小的命令是

$ stat -c %s *

您确实想要使用bash,awkcut 来执行此操作,而您的问题是为什么在第一行中它将是第四列和在第二个是第三个。解析lsis not recommended!的输出


编辑:

由于列是数字,所以我会使用greppositive lookahead

$ tar jtvf zip64support.tar.bz2|grep -Po '[0-9]+(?= [0-9]{4}-[0-9]{2}-[0-9]{2})' 
16195018
14417258

【讨论】:

  • 还可以查看stat manpage 了解更多格式选项。格式使用双引号,例如:stat -c "%s %z" <file>.
  • stat 适用于文件系统下的文件,我使用 -t 因为我不想提取存档中的文件。
  • 正确,您应该从一开始就包含此信息。我使用grep 添加了一个解决方案。
【解决方案2】:

试一试:

tar jtvf bla.tar.bz2|awk '$0=$3'

在你提到的问题中

获取后面有YYYY-mm-dd的一行中的数字。

如果你真的想用 grep:

tar ... |grep -oP '\d+(?= \d{4}-)'

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多