grep 文件中一行的前 n 和后 n 个字符

grep 文件中一行的前 n 和后 n 个字符

我有一个日志文件,如下所示:

Mar 23 08:20:23 New file got created in sec: 235
Mar 23 08:21:45 New file got created in sec: 127
Mar 23 08:22:34 New file got created in sec: 875
Mar 23 08:25:46 New file got created in sec: 322
Mar 23 08:26:12 New file got created in sec: 639

我需要输出如下:

Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639

我能做的就是 grep 行的第一部分或最后一部分。我无法将两者放在一起。如何从我的输入中获得所需的输出?

答案1

您可以将 cut 用作:

命令:

cut --complement -c17-43 file1.txt

输出:

Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639

答案2

你可以做这样的事情

awk '{print $1,$2,$3,":",$NF}' logfile

答案3

您可以使用sed

sed -r "s/^(.{15} ?).*(.{5})$/\1\2/" logfile

根据建议,我使第一个模式适应可能不是零填充的个位数日期,并用于.*中间模式以更加灵活。

答案4

这个怎么样:

sed -e 's/^\(.\{4\}\).*\(.\{4\}\)$/\1 \2/'

(您可以计算出 I/O 重定向或给出文件名等。有关更多调用信息,请参阅 sed(1)。)

在这里,我选择的字符数正好是 4 个,但您可以替换为您喜欢的任何数字。请注意,第一个和最后一个字符数甚至可以不同:

sed -e 's/^\(.\{5\}\).*\(.\{2\}\)$/\1 \2/'

这将返回每行的前 5 个字符和最后 2 个字符。我将让您弄清楚如何进一步参数化它。

另请注意,我选择了 sed(1) 而不是 grep(1)(或其变体之一)。我知道这可能不是您想要的,因为您确实要求 grep 正则表达式,而不是 sed 正则表达式。

相关内容