我有一个空间分隔文件的日志文件。结构是这个
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之间的内容。
但我想不出任何可以帮助我的事情。
以前是否有人必须这样做并且可以发光。
由于
答案 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};打印出来''