2017-05-25 66 views
0

我正在创建一个脚本来分析一些文件并提供必要的信息。我该如何使用grep作为猫

我在数组中设置了许多不同的变量,用于搜索文件中的不同方面。 例如日期,地点,类型。

但是我想让每个变量都是可选的,这就是我遇到问题的地方。

命令的语法本来简单 grep ${dates} filename | grep ${locations} | grep ${types}

但由于变量是可选的,上面不会有变量是否未设置工作。

我试图找到一种方式来获得grep来找到任何东西(即像egrep .* filename) 这样,我可以设置变量以适当的正则表达式,并有命令仍然可以运行。

不幸的是,当我设置变量等于''时,它冻结,当我将它设置为'。'它只是从当前目录中的每个文件中删除所有内容,当我将变量留空时,它将文件名作为变量并等待文件名。

有无论如何,我可以设置一个变量,使grep $variable file输出相同的猫会?

非常感谢提前!

回答

1

要获得grep表现得像cat使用空字符串作为搜索模式,即grep ""。因此,使一些可选的变量,但没有管道grep小号失败,只是引用变量:

grep "${dates}" filename | grep "${locations}" | grep "${types}" 

示范。搜索{250255260 ... 280}的数字,和:

x=5 y=2 z=7 ; seq 250 5 280 | grep "$x" | grep "$y" | grep "$z" 
275 

取消设置两个变量,并且它仍然有效:

unset x y ; seq 250 5 280 | grep "$x" | grep "$y" | grep "$z" 
270 
275 
-1

你可以发布源文件和目标输出。从你的问题来看,你听起来像只需要将grep -E与|一起使用管道分隔符。

grep -E "${dates}|${locations}|${types}" fileName 

,上面一行是自动获取你的任何图案的每次出现。这甚至不是一个正则表达式。

+0

你无需使用*扩展*正则表达式选项,只需'grep“$日期\ | $位置\ | $类型”文件名“是好的。(如果你需要扩展正则表达式,那么当然,使用它,但如果没有,基本的'grep'很好) –

+0

OP描述使用shell管道'|',而不是逻辑*或* s。比较'seq 10 5 50 | grep -E'2 | 5'',(查找* 2 * OR * 5 *)到'seq 10 5 50 | grep'5'| grep'2',(查找* 2 *和* 5 *)。 – agc

0

如果文件名中没有任何$日期,则没有任何内容可以输入管道的其余部分。

我认为最好的办法是分别为每个字符串grep。

如果您得到一个匹配,然后grep为下一个字符串。