grep以特定字符串开头的行

时间:2017-04-24 04:26:01

标签: regex string bash awk grep

我想找到一个以特定字符串开头的文件中的所有行。问题是,我事先并不知道字符串中有什么。该值存储在变量中。

天真的解决方案如下:

grep "^${my_string}" file.txt;

因为如果Bash变量my_string包含任何正则表达式特殊字符,grep会哭,并且每个人都会有糟糕的一天。

你不想让grep哭,是吗?

2 个答案:

答案 0 :(得分:5)

您应该使用awk代替grep进行使用index功能的非正则表达式搜索:

awk -v s="$my_string" 'index($0, s) == 1' file

index($0, s) == 1确保仅在开始时找到搜索字符串。

答案 1 :(得分:0)

如果Bash变量my_string包含任何正则表达式特殊字符,是什么意思,grep会哭

$ cat file
crying now
no cry
$ var="n.*"
$ echo "$var"
n.*
$ grep "^$var" file
no cry

现在@anubhava用勺子喂我问题(谢谢先生),使用grep来完成这项工作似乎需要至少两个grep s,因为你想要{{1}从字面上看,正则表达式字符在后者中使用grep(或-F):

fgrep

$ cat file OMG it’s full of *s $ var="*" $ grep "^.\{"${#var}"\}" file|grep -F "$var" *s 在Bash中返回${#var}长度,以及我们从文件开头提取的字符数量,用后者var进行检查。

(引自2001