Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从行-空格分隔的-shell命令的“开始到结束”和“结束到开始”字段之间提取字符串_Regex_Shell_Extract - Fatal编程技术网

Regex 从行-空格分隔的-shell命令的“开始到结束”和“结束到开始”字段之间提取字符串

Regex 从行-空格分隔的-shell命令的“开始到结束”和“结束到开始”字段之间提取字符串,regex,shell,extract,Regex,Shell,Extract,我有一个以空格分隔的日志文件。结构是这样的 2015年10月5日星期一23:17:52 0 10.0.0.1 3989728/dir/file name.txt X X acct proto 0* 我希望能够提取文件名,幸运的是,有时文件名中包含空格。e、 g“文件名.txt” 我不能简单地使用字段位置来剪切它,因为文件名中有时会出现空格 我想这样做的方式是得到从左到右的8号区域和从右到左的8号区域之间的值 但我想不出有什么可以帮我的 是否有人曾经做过这件事,并且可以发光 感谢如果没有更大的数据

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

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

我希望能够提取文件名,幸运的是,有时文件名中包含空格。e、 g“文件名.txt”

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

我想这样做的方式是得到从左到右的8号区域和从右到左的8号区域之间的值

但我想不出有什么可以帮我的

是否有人曾经做过这件事,并且可以发光


感谢

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


下面是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地址,整数)和最后8个字段之间的任何内容。只需使用正则表达式并将其应用于脚本

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
regex可以解释如下:

  • */
    匹配每个字符直到最后一个斜杠
  • ([^.]+\.[A-Za-z]*)
    匹配从那里到第一个点的所有内容,然后是字母字符。这是文件名。组将捕获匹配的文本
  • *
    与行的其余部分匹配
因此,整行被组1(文件名)捕获的文本
\1
替换,并输出到
logfile.txt


我们做了一些假设:文件路径必须始终有一个斜杠,文件名的扩展名必须只有一个点,扩展名仅由字母字符组成。

感谢大家的输入。我想了很多,然后用AWK来完成

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


cat文件| awk'{out=”“;for(i=9;类似这样的东西应该可以工作:$regex=“~\/(?:a-z)+?\.txt~i”;
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