【问题标题】:Extract string between fields from begin to end and end to begin of the line - space delimited - shell commands从行的开头到结尾和结尾到开头的字段之间提取字符串-空格分隔-shell命令
【发布时间】:2015-10-07 01:11:08
【问题描述】:

我有一个以空格分隔的日志文件。结构是这样的

2015 年 10 月 5 日星期一 23:17:52 0 10.0.0.1 3989728 /dir/file name.txt X X X X acct proto 0 *

我希望能够提取文件名,有时幸运的是,文件名中包含一个空格。例如“文件名.txt”

我不能简单地使用字段位置来剪切它,因为有时会出现在文件名中。

我想这样做的方法是获取从左到右的第 8 场和从右到左的第 8 场之间的内容。

但我想不出任何可以帮助我的方法。

以前有没有人必须这样做并且可以发光。

谢谢

【问题讨论】:

  • 这样的东西应该可以工作:$regex = "~\/(?: a-z)+?\.txt~i";

标签: regex shell extract


【解决方案1】:

如果没有更大的数据,这很难尝试,但这里有一个粗略的解决方案,如果第十个字段与指定的模式不匹配,则会丢弃它。 (这仅在文件名中有一个空格 ' ' 时才有效):

#!/bin/sh

STORE1=$( echo "Mon Oct 05 23:17:52 2015 0 10.0.0.1 3989728 /dir/file name.txt X X X X acct proto 0 *" | awk '{print $9}' )

STORE2=$( echo "Mon Oct 05 23:17:52 2015 0 10.0.0.1 3989728 /dir/file name.txt X X X X acct proto 0 *" | awk '{print $10}' )

# if the tenth field matches the string "X" discard it
if [ "$STORE2" != "X" ]
then STORE1="$STORE1 $STORE2"
fi

printf "%s" "$STORE1"

【讨论】:

    【解决方案2】:

    这是一个使用 python 的快速测试:

    import re
    
    txt = "Mon Oct 05 23:17:52 2015 0 10.0.0.1 3989728 /dir/file name.txt X X X X acct proto 0 *"
    print re.search("\d+(\.\d+){3}\s+\d+\s+(.*)(\s+\S+){8}",txt).group(2)
    

    是的,我意识到这不是 shell,但正则表达式会在您尝试的 (ip address, integer) 和最后 8 个字段之前提取任何内容。只需使用正则表达式并将其应用于您的脚本。

    【讨论】:

      【解决方案3】:
      echo "Mon Oct 05 23:17:52 2015 0 10.0.0.1 3989728 /dir/file name.txt X X X X acct proto 0 *" 
      
      sed -r 's#.*/([^.]+\.[A-Za-z]*).*#\1#' logfile.txt
      

      正则表达式可以解释如下:

      • .*/ 匹配每个字符,直到最后一个斜线。
      • ([^.]+\.[A-Za-z]*) 匹配从那里到第一个点的所有内容,后跟字母字符。这是文件名。匹配的文本被组捕获。
      • .* 匹配该行的其余部分。

      因此整行替换为\1,组1 捕获的文本(文件名),并输出到logfile.txt

      做了一些假设:文件的路径必须始终有一个斜杠,文件名必须只有一个点作为扩展名,并且扩展名仅包含字母字符。

      【讨论】:

        【解决方案4】:

        感谢大家的投入。我对此进行了更多思考,并使用 AWK 完成了这项工作。

        循环文件内容从我想最后一个字段减去 8。

        猫文件 | awk '{out=""; for(i=9;i

        【讨论】:

          猜你喜欢
          • 2011-03-01
          • 2011-12-22
          • 2019-11-06
          • 2021-03-22
          • 1970-01-01
          • 2021-06-02
          • 2013-10-07
          • 1970-01-01
          • 2018-07-11
          相关资源
          最近更新 更多