我认为正则表达式在任何情况下都是相同的(例如:
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行仍然有效。
很抱歉,但完整的解释很长。
答案 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。