Regex 从行-空格分隔的-shell命令的“开始到结束”和“结束到开始”字段之间提取字符串
我有一个以空格分隔的日志文件。结构是这样的 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号区域之间的值 但我想不出有什么可以帮我的 是否有人曾经做过这件事,并且可以发光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号区域之间的值 但我想不出有什么可以帮我的 是否有人曾经做过这件事,并且可以发光 感谢如果没有更大的数据
感谢如果没有更大的数据,这是很难尝试的,但是这里有一个粗略的解决方案,如果第十个字段与指定的模式不匹配,它将丢弃该字段。(仅当文件名中只有一个空格
'
时,此选项才有效):
下面是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
替换,并输出到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