正则表达式得到分钟而不是秒

时间:2012-05-11 14:14:12

标签: regex sed grep

我有很多次来自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

来自原始文件...... 有什么提示吗?

7 个答案:

答案 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

  1. 's / matchpattern / replacepattern /'与intitial'=替换,是可用的主要工具之一。
  2. 正则表达式中的^ char将匹配锚定到行的开头
  3. $ char将正则表达式的匹配锚定到行尾。
  4. 你应该只执行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

之前删除[然后从空白处删除。两个命令。