AWK:匹配任何字符串的正则表达式是什么?

时间:2018-03-31 22:52:18

标签: regex awk

  

我认为正则表达式在任何情况下都是相同的(例如:   grep),但我正在使用awk进行测试。

案例示例

$ cat Test.csv
2018-03-31,22:39,Test,2,4,2
2018-03-31,22:40,Test02,2,4,2
2018-03-31,22:40,Test03,2,4,2
2018-03-31,22:40,Test04,2,4,2
2018-03-31,22:59,Test03,5,4,2
2018-03-31,23:00,Test07,6,4,2
2018-03-31,23:00,Test08,2,2,2

我想知道如何匹配任何值(任何字符串),例如,字段3:

$ awk -F ',' '$3 == *' Test.csv
awk: syntax error at source line 1
 context is
        $3 == >>>  * <<<
awk: bailing out at source line 1

-

$ awk -F ',' '$3 == .*' Test.csv
awk: syntax error at source line 1
 context is
        $3 == >>>  . <<< *
awk: bailing out at source line 1

-

$ awk -F ',' '$3 == /*/' Test.csv
awk: illegal primary in regular expression * at
 source line number 1
 context is
        $3 == >>>  /*/ <<<

-

$ awk -F ',' '$3 == /.*/' Test.csv
[No results]

-

$ awk -F ',' '$3 == /^*/' Test.csv
[No results]

即使可以有其他方法来解决问题,我如何匹配每个可能的字符串,在特定字段使用正则表达式(假设为CSV) AWK?

如果可能的话,包含NUL字符串(对于2018-03-31,23:00,,2,2,2这样的空字段)的某些方法可能很有用,因此AWK返回每一行。

为什么我需要这个

  

(根据要求;解释有点尴尬,抱歉;仅限于那些人   感兴趣的)

基本上用于代码简化(可读性)。我的shell脚本的构造方式我更喜欢执行搜索:

awk -F ',' -v AL__AWK="$AL" -v VL__AWK="$VL" -v DL__AWK="$DL" -v Codigo__AWK="$Codigo" -v SubCodigo__AWK="$SubCodigo" '$4 == AL__AWK && $5 == VL__AWK && $6 == DL__AWK && $8 ~ Codigo__AWK && $9 ~ SubCodigo__AWK' "$LogFile"

可以看出(呃...或者我希望),CSV文件中的字段搜索是基于变量的。其中一些变量使用特定值初始化,一些变量来自参数输入。所以,拥有一个通用&#34;任何字符串&#34;值会阻止我以多种不同的方式编写这个AWK行。

I.E:有时脚本会通过输入参数接收Codigo=Ptt值,而某些Codigo变量不会通过参数输入来定义;在第二种情况下,我将执行Codigo=".*",因此上述AWK行仍然有效。

很抱歉,但完整的解释很长。

2 个答案:

答案 0 :(得分:1)

@SopalajodeArrierez现在我看到了你的理由我理解你是做什么的,你不需要想出一个匹配任何字符串的正则表达式,你的未设置的shell变量已经是这样的正则表达式。看:

Application

因此,如果您的shell变量未设置,请保持未设置,因为任何字符串将与正则表达式比较中的空字符串部分匹配。

答案 1 :(得分:0)

一样简单(请注意~而不是==运算符):

$ awk -F ',' '$3 ~ /.*/' Test.csv
2018-03-31,22:39,Test,2,4,2,,,
2018-03-31,22:40,Test02,2,4,2,,,
2018-03-31,22:40,Test03,2,4,2,,,
2018-03-31,22:40,Test04,2,4,2,,,
2018-03-31,22:59,Test03,5,4,2,,,
2018-03-31,23:00,Test07,6,4,2,,,
2018-03-31,23:00,Test08,2,2,2,,,

没有解释进行这种搜索的原因(原始海报告诉它描述起来很苛刻),这似乎只是某种学术问题,但我想有一天可能会有人需要它。

对于使用变量作为模式的情况(如问题所述):

$ foo="03"
$ awk -F ',' -v foo__AWK="$foo" '$3 ~ foo__AWK' Test.csv
2018-03-31,22:40,Test03,2,4,2,,,
2018-03-31,22:59,Test03,5,4,2,,,

$ foo=".*"
$ awk -F ',' -v foo__AWK="$foo" '$3 ~ foo__AWK' Test.csv
2018-03-31,22:39,Test,2,4,2,,,
2018-03-31,22:40,Test02,2,4,2,,,
2018-03-31,22:40,Test03,2,4,2,,,
2018-03-31,22:40,Test04,2,4,2,,,
2018-03-31,22:59,Test03,5,4,2,,,
2018-03-31,23:00,Test07,6,4,2,,,
2018-03-31,23:00,Test08,2,2,2,,,

$ foo=""
$ awk -F ',' -v foo__AWK="$foo" '$3 ~ foo__AWK' Test.csv
2018-03-31,22:39,Test,2,4,2,,,
2018-03-31,22:40,Test02,2,4,2,,,
2018-03-31,22:40,Test03,2,4,2,,,
2018-03-31,22:40,Test04,2,4,2,,,
2018-03-31,22:59,Test03,5,4,2,,,
2018-03-31,23:00,Test07,6,4,2,,,
2018-03-31,23:00,Test08,2,2,2,,,

所以,.*就像``as'匹配任何模式“regexp。