2014-11-18 3 views
0

Можно ли использовать grep массив в bash? В основном у меня есть два массива, один массив, который я хочу пропустить, и другой массив, который я хочу проверить, чтобы увидеть, есть ли каждая строка в другом массиве или нет.grep through array в bash

Грубый пример:

for CLIENTS in ${LIST[@]}; do 
    #lost as to best way to grep a array with out putting the values in a file. 
    grep ${server_client_list[@]} 
done 

ответ

0

Bash предоставляет подстроку, соответствующую. Это устраняет необходимость появления внешних процессов и подоболочек. Просто используйте:

for CLIENTS in ${LIST[@]}; do 
    if [[ "${server_client_list[@]}" =~ "$CLIENTS" ]]; then 
     echo "CLIENTS ($CLIENTS) is in server_client_list" 
    fi 
done 

Примечание: это работает для bash, не sh.

4

Вы можете использовать grep -f с помощью процесса замещения:

grep -Ff <(printf "%s\n" "${LIST[@]}") <(printf "%s\n" "${server_client_list[@]}") 
+0

Нужно ли добавить цикл for, чтобы он зацикливал каждую строку в LIST [@ array? – doanerock

+0

@doanerock Попробуйте сами ... 'a = (1 2); printf "% d \ n" "$ {a [@]}" ' – gboffi

+0

@doanerock: вам не нужно зацикливать. Эта команда найдет соответствующие элементы 'LIST', которые присутствуют в массиве' server_client_list'. – anubhava

0

Вы можете использовать следующую функцию:

function IsInList { 
    local i 
    for i in "${@:2}"; do 
     [ "$i" = "$1" ] && return 0 
    done 
    return 1 
} 

for CLIENT in "${LIST[@]}"; do 
    IsInList "$CLIENT" "${server_client_list[@]}" && echo "It's in the list!" 
done 

Обратите внимание, что кавычки ${LIST[@]} и ${server_client_list[@]} очень важны, потому что они гарантируют расширение массива для расширения, как вы хотите, вместо того, чтобы иметь неприятный сюрприз, когда пространство пробивается в одно из этих значений массива.

Кредиты: Я взял эту функцию из ответа Патрика в this post, когда мне было нужно что-то в этом роде.

Edit:

Если вы ищете что-то с возможностями регулярных выражений, можно также использовать следующие:

function IsInList { 
    local i 
    for i in "${@:2}"; do 
     expr match "$i" "$1" && return 0 
    done 
    return 1 
}