从开始到结束之间的字段之间提取字符串,并以行 - 空格分隔 - shell命令结束开始

时间:2015-10-07 01:11:09

标签: regex shell extract

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

Mon Oct 05 23:17:52 2015 0 10.0.0.1 3989728 / dir / file name.txt X X X X acct proto 0 *

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

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

我想要这样做的方式是从左到右获得字段8之间的内容,从右到左获得字段8之间的内容。

但我想不出任何可以帮助我的事情。

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

由于

4 个答案:

答案 0 :(得分:0)

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

#!/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"

答案 1 :(得分:0)

这是使用python的快速测试:

origin

是的,我意识到这不是shell,但是正则表达式会在你尝试的时候在(ip地址,整数)和最后8个字段之间拾取任何东西。只需使用正则表达式并将其应用于您的脚本。

答案 2 :(得分:0)

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

做出了一些假设:文件必须始终有一个斜杠,文件名必须只有一个点用于扩展名,扩展名只包含字母字符。

答案 3 :(得分:0)

感谢大家的投入。我想了一下它并用AWK来完成它。

从我想要的字段减去8的字段中循环文件内容。

cat file | awk'{out =“”; for(i = 9; i< = NF-8; i ++){out = out“”$ i};打印出来''