尝试编写正则表达式以捕获给定的字母数字值,但它也捕获其他数值。什么是获得期望输出的正确方法?
代码grep -Eo '([[[:alnum:]])w+' file > output
$ cat file
2022-04-29 08:45:11,754 [14] [Y23467] [546] This is a single line
2022-04-29 08:45:11,764 [15] [fpes] [547] This is a single line
2022-04-29 08:46:12,454 [143] [mwalkc] [548] This is a single line
2022-04-29 08:49:12,554 [143] [skhat2] [549] This is a single line
2022-04-29 09:40:13,852 [5] [narl12] [550] This is a single line
2022-04-29 09:45:14,754 [1426] [Y23467] [550] This is a single line
电流输出-
[14
[Y23467
[546
[15
[fpes
[547
[143
[mwalkc
[548
[143
[skhat2
[549
[5
[narl12
[550
[1426
[Y23467
[550
期望输出-
Y23467
fpes
mwalkc
skhat2
narl12
Y23467
解决方案1:
使用您显示的示例,请尝试以下awk
代码。简单的解释是,用gsub
函数代替第4个字段的[
和]
,再打印第4个字段。
awk '{gsub(/[|]/,"",$4);print $4}' Input_file
解决方案2:对于GNUgrep
,请尝试以下解决方案。
grep -oP '^[0-9]{4}(-[0-9]{2}){2} [0-9]{2}(:[0-9]{2}){2},[0-9]{1,3} [[0-9]+] [K[^]]*' Input_file
解释:增加上述正则表达式在GNUgrep
中使用的详细说明。
^[0-9]{4}(-[0-9]{2}){2} ##From starting of value matching 4 digits followed by dash 2 digits combination of 2 times.
[0-9]{2}(:[0-9]{2}){2} ##Matching space followed by 2 digits followed by : 2 digits combination of 2 times.
,[0-9]{1,3} ##Matching comma followed by digits from 1 to 3 number.
[[0-9]+] [K ##Matching space followed by [ digits(1 or more occurrences of digits) followed by space [ and
##then using K to forget all the previously matched values.
[^]]* ##Matching everything just before 1st occurrence of ] to get actual values.
使用[[:alnum:]]
或w
表示它可能匹配字母数字或单词字符。
如果可以有数字,但应该有字符a-z,并且支持使用-P
作为perl兼容的正则表达式:
grep -oP '[Kd*[A-Za-z][dA-Za-z]*(?=])' file
[
匹配[
K
忘记目前匹配的内容d*[A-Za-z]
匹配可选数字和至少一个字符a- za -z[dA-Za-z]*
匹配可选字符a-zA-Z和数字(?=])
断言]
向右
Y23467
fpes
mwalkc
skhat2
narl12
Y23467
如果只能出现一次,您也可以将sed与捕获组(...)
一起使用,并使用1
替换该组
sed 's/.*[([[:digit:]]*[[:alpha:]][[:alnum:]]*)].*/1/' file
你的问题有几个部分。首先,我将尝试帮助你与你的正则表达式(但它可能会解锁更多的问题);下面我将向您展示另一种选择。
Regex关于[[:alnum:]]
需要理解的是,它捕获任何包含字母数字字符的内容。它会捕获123abc"因为所有这些字符都是字母数字。它单独判断每个字符,不能捕获"只包含数字和字母的部分";喜欢你想要的。
然而,通过将几个grep
链接在一起,我们可以过滤掉只包含数字的行。
grep -Eo '([[[:alnum:]])w+' file | grep -v -Eo '[[[:digit:]]+(w+|$)' > output
为了进一步完善这一点,您的正则表达式中似乎有几个错误。首先,您在捕获的部分中包含了[
,这就是为什么它在结果中捕获[
,所以您应该将([
更改为[(
,以将[
移动到括号( ... )
中捕获部分的外部。
接下来,[[:alnum:]]
和w+
的组合可能没有达到预期的效果。它查找单个字母数字字符,后面跟着一个或多个"单词"。字符(包括所有的字母数字和一些额外的字符)。你可能需要([[:alnum:]]+)
而不是([[:alnum:]])w+
为什么不用cut
代替呢?cut -d' ' -f4
将占据第4个字段(带"空格")。作为字段之间的分隔符)
$ cut -d' ' -f 4 file
[Y23467]
[fpes]
[mwalkc]
[skhat2]
[narl12]
[Y23467]
如果您还想删除方括号,请尝试
$ cut -d' ' -f 4 file | grep -Eo 'w+'
Y23467
fpes
mwalkc
skhat2
narl12
Y23467
使用sed
$ sed 's/([^[]*[){2}([^]]*).*/2/' input_file
Y23467
fpes
mwalkc
skhat2
narl12
Y23467
使用FPAT
与GNUawk
:
awk -v FPAT='[[[:alnum:]]*]' '{gsub(/^[|]$/, "",$(NF-1));print $(NF-1)}' file
Y23467
fpes
mwalkc
skhat2
narl12
Y23467
将
FPAT
设置为'[[[:alnum:]]*]'
,我们匹配[
char后跟0或多个字母数字字符后跟]
char。用
gsub()
函数去掉开头的[
和最后的]
字符。我们打印最后一个字段之前的字段,即
$(NF-1)
字段,不包含[
和]
字符。