Como pesquisar cada ocorrência em um arquivo de texto Linux?

1

Eu tenho 23 strings para pesquisar, quero que ele retorne as que estão no arquivo.

Eu tenho o código abaixo:

users='User1\|User2\|User3\|User4\|User5\|User6\|User7\|User8\|User9\|User10\|User11\|User12..User23'

Saída desejada:

User1 is in the file
User2 is not in the file
...
User 23 is in the file

Eu não tenho idéia de como fazer isso, eu estava pensando em uma matriz, mas eu quero algumas dicas, se for possível. Agradecemos antecipadamente.

    
por Mareyes 21.08.2018 / 18:54

4 respostas

2

Tente isso,

users=( User1 User2 User3 User4 )
for i in "${users[@]}"
do
   grep -qw $i file && echo "$i is in the file" || echo "$i is not in the file"
done

De man :

-q, --quiet, --silent

Quiet; do not write anything to standard output. Exit immediately with zero status if any match is found, even if an error was detected.

    
por 21.08.2018 / 19:01
4

Use uma matriz:

users=(User1 User2 User3 User4) # et cetera
for i in "${users[@]}"; do
    echo -n "$user is "
    if grep -q "$user" inputfile; then
        echo "present"
    else
        echo "not present"
    fi
done

grep -q executará a pesquisa, mas não retornará nenhuma saída, permitindo que você a use silenciosamente em um teste if .

Como alternativa, você pode colocar cada usuário on-line em um arquivo chamado Users e, em seguida:

grep -o -f Users inputfile

Isto irá mostrar uma lista de todos os usuários vistos. Se você quiser ver os usuários presentes e ausentes, poderá:

echo "Users present:"
grep -o -f Users inputfile
echo "Users absent:"
grep -vo -f Users inputfile
    
por 21.08.2018 / 19:07
1

Um novo ajuste.

users=( User1 User2 User3 User4 )
for i in "${users[@]}"
do
   echo "$i is" $(grep -qw $i file || echo "not") "in the file"
done
    
por 21.08.2018 / 22:06
1

Com apenas uma única varredura no arquivo: this is bash

# the array of user names
users=( User{1..23} )
# an array of grep options: ( -e User1 -e User2 ...)
for u in "${users[@]}"; do grep_opts+=( -e "$u" ); done
# scan the input file and save the user names that are present in the file
readarray -t users_present < <(grep -Fo "${grep_opts[@]}" input | sort -u)
# find the user names absent from the file
# this assumes there are no spaces in any of the user names.
for u in "${users[@]}"; do
     [[ " ${users_present[*]} " == *" $u "* ]] || users_absent+=( "$u" )
done
# and print out the results
printf "%s is in the file\n" "${users_present[@]}"
printf "%s is NOT in the file\n" "${users_absent[@]}"
    
por 21.08.2018 / 22:31