我有很多次来自apache日志...
96.99.193.124 - - [10/May/2012:22:59:29 +0000] 0 "GET / " 200 123 "-" "-"
96.29.193.124 - - [10/May/2012:22:59:56 +0000] 0 "GET / " 200 123 "-" "-"
96.29.193.125 - - [10/May/2012:22:59:56 +0000] 0 "GET / " 200 123 "-" "-"
96.29.193.125 - - [10/May/2012:23:00:00 +0000] 0 "GET / " 200 123 "-" "-"
96.29.193.125 - - [10/May/2012:23:00:00 +0000] 0 "GET / " 200 123 "-" "-"
要提取日期时间戳,我这样做:
sed -e 's;^.*\(\[.*\]\).*$;\1;' inputFileName > outputFileName
哪个给了我
[10/May/2012:22:59:29 +0000]
[10/May/2012:22:59:56 +0000]
[10/May/2012:22:59:56 +0000]
[10/May/2012:22:59:56 +0000]
[10/May/2012:23:00:00 +0000]
[10/May/2012:23:00:00 +0000]
我想删除秒部分和方括号以及秒,然后得到:
10/May/2012:22:59
10/May/2012:22:59
10/May/2012:22:59
10/May/2012:23:00
10/May/2012:23:00
来自原始文件...... 有什么提示吗?
答案 0 :(得分:2)
试试这个
sed -e 's;^.*\[\([^+]*\).*\].*$;\1;'
解释
1-我把括号放在组外面 2-并把+东西放在外面
已经完成了。
答案 1 :(得分:2)
为什么不只是
echo '96.99.193.124 - - [10/May/2012:22:59:29 +0000] 0 "GET / " 200 123 "-" "-""' \
| sed 's/^.*\[//;s/ .*$//;s/...$//'
<强>输出强>
10/May/2012:22:59
<强>解释强>
96.99.193.124 - - [10/May/2012:22:59:29 +0000] 0 "GET / " 200 123 "-" "-""'
^........pt1.......[ ...............pt2.................$
:.. (pt3)
每个部分都消除了一大块多余的字符串
pt1 s/^.*\]\[//
match/deletes everything up to the first [.
I use to `\[' to escape the normal meaning of that char in sed
as the beginning of a character class, i.e. `[a-z]` (for 1 example)
pt2 s/ .*$//
match/deletes everything from the first space char to the end of the line
pt3 s/...$//
match/deletes the last 3 chars form the end of the line.
回想一下sed
你应该只执行pt1,然后添加pt2然后再添加pt3以轻松查看正在实现的目标。
我希望这会有所帮助。
答案 2 :(得分:2)
这可能对您有用:
sed 's/.*\[\(.*\):.*/\1/' file
您可以使用贪婪,即\(.*\):
抓住最后:
之前的所有内容
答案 3 :(得分:2)
sed -e 's;^.*\[\(.\{17\}\).*\].*$;\1;'
此版本定位起始括号,然后在提取的组中明确包含接下来的17个字符(感兴趣的字符串)。
答案 4 :(得分:1)
grep -oP
的另一种方式:
grep -oP "\[\K[^\]\[ ]+" FILE
如果您的grep没有-P
切换,请尝试pcregrep
答案 5 :(得分:1)
这是一种模式:
\[(\d+/\w+/\d+:\d+:\d+)
支架用作锚。
这里的匹配者很一般。例如,使用\w+
捕获月份,它将匹配包含字母或数字的任何单词,但是使用此订单组合的所有匹配器为这种Apache行提供了强大的模式。
您在整条线上使用此模式,因此无需首先捕获括号内的部分。只需捕获您想要的最终数据。
答案 6 :(得分:1)
sed 's/.*\[//;s/:.. .*//' infile > outfile
之前删除[然后从空白处删除。两个命令。