在bash脚本中查找包含所有关键字的行

在bash脚本中查找包含所有关键字的行,bash,grep,Bash,Grep,基本上,我想要的东西的行为类似于: cat file | grep -i keyword1 | grep -i keyword2 | grep -i keyword3 如何使用接受可变长度关键字参数列表的bash脚本实现这一点?脚本应该对包含所有关键字的行进行不区分大小写的匹配。我不知道这是否有效,我认为这很难看,也可能有一些实用程序,但是: #!/bin/bash unset keywords matchlist keywords=("$@") for kw in "${keywords

基本上,我想要的东西的行为类似于:

cat file | grep -i keyword1 | grep -i keyword2 | grep -i keyword3

如何使用接受可变长度关键字参数列表的bash脚本实现这一点?脚本应该对包含所有关键字的行进行不区分大小写的匹配。

我不知道这是否有效,我认为这很难看,也可能有一些实用程序,但是:

#!/bin/bash

unset keywords matchlist
keywords=("$@")

for kw in "${keywords[@]}"; do
matchlist="$matchlist /$kw/ &&"
done

matchlist="${matchlist% &&}"

# awk "$matchlist { print; }" < <(tr '[:upper:]' '[:lower:]' <file)
awk "$matchlist { print; }" file

是的,它需要一些关于特殊角色和东西的健壮性。这只是为了展示这个想法。

我不知道这是否有效,我认为这很难看,也可能有一些实用性,但是:

#!/bin/bash

unset keywords matchlist
keywords=("$@")

for kw in "${keywords[@]}"; do
matchlist="$matchlist /$kw/ &&"
done

matchlist="${matchlist% &&}"

# awk "$matchlist { print; }" < <(tr '[:upper:]' '[:lower:]' <file)
awk "$matchlist { print; }" file
是的,它需要一些关于特殊角色和东西的健壮性。这只是为了展示想法。

试试看:

shopt -s nocasematch
keywords="keyword1|keyword2|keyword3"
while read line; do [[ $line =~ $keywords ]] && echo $line; done < file
编辑:

这是一个测试所有关键字(而不仅仅是任何关键字)的版本:

keywords=(keyword1 keyword2 keyword3)    # or keywords=("$@")
qty=${#keywords[@]}
while read line
do
    count=0
    for keyword in "${keywords[@]}"
    do
        [[ "$line" =~ $keyword ]] && (( count++ ))
    done
    if (( count == qty ))
    then
        echo $line
    fi
 done < textlines
尝试一下:

shopt -s nocasematch
keywords="keyword1|keyword2|keyword3"
while read line; do [[ $line =~ $keywords ]] && echo $line; done < file
编辑:

这是一个测试所有关键字(而不仅仅是任何关键字)的版本:

keywords=(keyword1 keyword2 keyword3)    # or keywords=("$@")
qty=${#keywords[@]}
while read line
do
    count=0
    for keyword in "${keywords[@]}"
    do
        [[ "$line" =~ $keyword ]] && (( count++ ))
    done
    if (( count == qty ))
    then
        echo $line
    fi
 done < textlines
您可以使用bash4.0++

shopt -s nocasematch
while read -r line
do
    case "$line" in 
        *keyword1*) f=1;;&
        *keyword2*) g=1;;&
        *keyword3*) 
            [ "$f" -eq 1 ] && [ "$g" -eq 1 ] && echo $line;;
    esac
done < "file"
shopt -u nocasematch
您可以使用bash4.0++

shopt -s nocasematch
while read -r line
do
    case "$line" in 
        *keyword1*) f=1;;&
        *keyword2*) g=1;;&
        *keyword3*) 
            [ "$f" -eq 1 ] && [ "$g" -eq 1 ] && echo $line;;
    esac
done < "file"
shopt -u nocasematch

找到了一种方法来和grep一起做这件事

KEYWORDS=$@
MATCH_EXPR="cat file"
for keyword in ${KEYWORDS};
do
  MATCH_EXPR="${MATCH_EXPR} | grep -i ${keyword}"
done
eval ${MATCH_EXPR}

找到了一种方法来和grep一起做这件事

KEYWORDS=$@
MATCH_EXPR="cat file"
for keyword in ${KEYWORDS};
do
  MATCH_EXPR="${MATCH_EXPR} | grep -i ${keyword}"
done
eval ${MATCH_EXPR}
将此用作脚本

#! /bin/bash
awk -v IGNORECASE=1 -f <(
  P=; for k; do [ -z "$P" ] && P="/$k/" || P="$P&&/$k/"; done
  echo "$P{print}"
)
并将其作为

script.sh keyword1 keyword2 keyword3 < file
将此用作脚本

#! /bin/bash
awk -v IGNORECASE=1 -f <(
  P=; for k; do [ -z "$P" ] && P="/$k/" || P="$P&&/$k/"; done
  echo "$P{print}"
)
并将其作为

script.sh keyword1 keyword2 keyword3 < file
我会用Perl来做

要查找至少包含其中一行的所有行,请执行以下操作:

perl -ne'print if /(keyword1|keyword2|keyword3)/i' file
要查找包含所有行的所有行,请执行以下操作:

perl -ne'print if /keyword1/i && /keyword2/i && /keyword3/i' file
我会用Perl来做

要查找至少包含其中一行的所有行,请执行以下操作:

perl -ne'print if /(keyword1|keyword2|keyword3)/i' file
要查找包含所有行的所有行,请执行以下操作:

perl -ne'print if /keyword1/i && /keyword2/i && /keyword3/i' file
下面是bash中名为search.sh的脚本,它将在文件或文件夹中的行中搜索所有指定的关键字:

#!/bin/bash
if [ $# -lt 2 ]; then
    echo "[-] $0 file_to_search/folder_to_search keyword1 keyword2 keyword3 ..."
    exit
fi
all_args="$@"
i=0
results=""  # this will store the cumulative results from each keyword search
for arg in $all_args; do
    if [ $i -eq 0 ]; then
        # first argument is the file/folder to search
        file_to_search="$arg"
        i=$(($i + 1))
    elif [ $i -eq 1 ]; then
        # search the file/folder with first keyword (first search)
        results=`grep --color=always -r -n -i "$arg" "$file_to_search"`
        i=$(($i + 1))
    else
        # now keep searching the results from first search for other keywords
        results=`echo "$results" | grep --color=always -i "$arg"`
        i=$(($i + 1))
    fi
done
echo "$results"
上面的脚本调用示例将在“tools.txt”文件中搜索“python”和“jira”关键字:

./search.sh tools.txt python jira
下面是bash中名为search.sh的脚本,它将在文件或文件夹中的行中搜索所有指定的关键字:

#!/bin/bash
if [ $# -lt 2 ]; then
    echo "[-] $0 file_to_search/folder_to_search keyword1 keyword2 keyword3 ..."
    exit
fi
all_args="$@"
i=0
results=""  # this will store the cumulative results from each keyword search
for arg in $all_args; do
    if [ $i -eq 0 ]; then
        # first argument is the file/folder to search
        file_to_search="$arg"
        i=$(($i + 1))
    elif [ $i -eq 1 ]; then
        # search the file/folder with first keyword (first search)
        results=`grep --color=always -r -n -i "$arg" "$file_to_search"`
        i=$(($i + 1))
    else
        # now keep searching the results from first search for other keywords
        results=`echo "$results" | grep --color=always -i "$arg"`
        i=$(($i + 1))
    fi
done
echo "$results"
上面的脚本调用示例将在“tools.txt”文件中搜索“python”和“jira”关键字:

./search.sh tools.txt python jira

你是在问我们最好的方法是什么吗?是的。在包含可变数量关键字的bash脚本中,最优雅/有效的方法是什么?您是否在问我们最好的方法是什么?是的。在包含可变数量关键字的bash脚本中,最优雅/有效的方法是什么?谢谢,这就是要点。但是我该如何使关键字匹配像grep-I一样不区分大小写呢?你抓住我了!我认为GNUawk有点像IGNORECASE变量,但我不确定。如果是一个选项,则在读入时可以将输入文件小写,并仅使用小写关键字:awk…<谢谢,这就是要点。但是我该如何使关键字匹配像grep-I一样不区分大小写呢?你抓住我了!我认为GNUawk有点像IGNORECASE变量,但我不确定。如果是一个选项,则在读入时可以将输入文件小写,并仅使用小写关键字:awk…<谢谢,我以前从未使用过shopt,学习新东西总是很愉快。这提供了不区分大小写的匹配,但它匹配包含任何关键字的行。我只想匹配包含所有关键字的行。谢谢,我以前从未使用过shopt,学习新东西总是很高兴。这提供了不区分大小写的匹配,但它匹配包含任何关键字的行。我只想匹配包含所有关键字的行。