如果一行包含一些字符串,如何grep?

0 grep shell-script text-processing

我有一个名为student的设置文件

grade1 class1 11 student
grade1 class1 12 student
grade2 class1 21 student
grade2 class2 22 student
......
Run Code Online (Sandbox Code Playgroud)

现在我创建一个test.sh文件来读取学生。如果输入 Gradename 和 studentnumber ,包含两个字符串的行将被复制到student_copy。代码将如下所示:

echo Input gradename and studentnumber
read gradename
read studentnumber

if (input gradename and studnetnumber);
then
    echo "the line include them" >> student_copy
Run Code Online (Sandbox Code Playgroud)

例如:

if (input grade1 and 11);
then 
    echo grade1 class1 11 student >> student_copy
Run Code Online (Sandbox Code Playgroud)

cas*_*cas 6

grep不进行逻辑AND运算(例如match patternA AND patternB),最接近的是构造一个更长的正则表达式来匹配任何一种可能的变体(例如grep -E 'patternA.*patternB|patternB.*patternA')。如果您有很多要匹配的模式,这将变得非常笨拙和笨拙。

做你想做的最简单的方法是使用脚本语言,如awkperl代替grep.

例如,以下awk单行将匹配出现两种模式的任何行。

awk '/patternA/ && /patternB/'
Run Code Online (Sandbox Code Playgroud)

任何模式匹配也可以反转,例如,如果您想匹配任何包含不包含模式 B 的模式 A 的行(即AND NOT操作):

awk '/patternA/ && ! /patternB/'
Run Code Online (Sandbox Code Playgroud)

注意:一种简单的方法是使用grep patternA | grep patternB(or grep patternA | grep -v patternB) - 这确实实现了逻辑 AND(或 AND NOT),但代价是运行多个grep命令而不是单个awkorperl命令。