使用Sed或任何Unix命令匹配两个字符串之间的所有字符

时间:2016-01-09 23:27:07

标签: regex bash unix awk sed

我有一个日志文件,我想删除我的日志文件中的所有com.test.data文本。在下面的示例中,我希望所有出现的粗体都被条带化。

我想要的文本之后的新行会造成严重破坏,删除所有\ n会破坏整个.log文件。

我尝试了grep -e 'com.test.data' debug.log --color -v > test.log

还尝试sed 's/com.test.data -\(.*\)2016-01/\1/' debug.log > test.log

还尝试sed '/'com.test.data -'/,/2016-01/ s/[a-z]*// p' debug.log > test.log

一切似乎都失败了。

我的计划是找到'com.test.data - '和'2016-01'之间的所有文字,将所有这些替换为'empty'(全部删除)。 然后拿我的文件并使用grep给我除'com.test.data - '之外的所有行。  首先这样做似乎让我更接近。

INPUT

2016-01-05 14:45:05,264 com.test.data - blah blah blahsd

afdadfasdfsd
sdsdfsdffssfddsf

dfsdsfdfsdfdsdfs
fsdsdfdfs
2016-01-05 14:46:05,264 com.test.rest - Testing 123
2016-01-05 14:47:05,264 com.test.data - blah blah blahsd

afdadfasdfsd
sdsdfsdffssfddsf
dfsdsfdfsdfdsdfs

fsdsdfdfs
2016-01-05 14:46:05,264 com.test.rest - Testing 123

或使用

sed 's/^2016-01/@/' debug.log > test.log //Add @ to beginning of file

现在它只是从com.test.data --->中找到文本。 @

让输入变得更轻松的新输入

@-05 14:45:05,264 com.test.data - blah blah blahsd

afdadfasdfsd
sdsdfsdffssfddsf

dfsdsfdfsdfdsdfs
fsdsdfdfs
@-05 14:46:05,264 com.test.rest - Testing 123
@-05 14:47:05,264 com.test.data - blah blah blahsd

afdadfasdfsd
sdsdfsdffssfddsf
dfsdsfdfsdfdsdfs

fsdsdfdfs
@-05 14:46:05,264 com.test.rest - Testing 123

输出

2016-01-05 14:46:05,264 com.test.rest - Testing 123

2016-01-05 14:46:05,264 com.test.rest - Testing 123

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

sed -r -n '/^[0-9:, -]{24}com\.test\.data /{:a;n;/^[0-9:, -]{24}/!ba;/ com\.test\.data /ba;};p;' file

在某些unix系统中,选项-r不存在,并被-E 替换(使用扩展正则表达式语法)

答案 1 :(得分:1)

此脚本循环输入并记住以日期开头的最后一行是否包含com.test.data。如果没有,则会打印该行。

#!/bin/bash

re='^[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}'

printflag=1

while IFS= read -r line || [[ -n $line]]; do
    if [[ $line =~ $re ]]; then
        if [[ $line =~ com\.test.\data ]]; then
            printflag=0
        else
            printflag=1
        fi
    fi
    if (( printflag )); then
        echo "$line"
    fi
done < "$1"

这将日志文件的名称作为参数。存储为script时,请使用

./script debug.log

答案 2 :(得分:1)

如果以下脚本没有完全符合您的要求,则应该很容易使其适应您的要求。它还具有便携性,高效性和可维护性:

awk '
  BEGIN {ok=1}
  /^ *@-/ { if ($3 == "com.test.data") {ok=0; next} else {ok=1} }
  ok {print}'

答案 3 :(得分:0)

使用测试123打印行

awk '/Testing 123/' file
2016-01-05 14:46:05,264 com.test.rest - Testing 123
2016-01-05 14:46:05,264 com.test.rest - Testing 123