Eu quero pesquisar várias strings em dois arquivos. Se uma string for encontrada em ambos os arquivos, faça algo. Se uma string for encontrada em apenas um arquivo, faça outra coisa.
Meus comandos são os seguintes:
####This is for the affirmative sentence in both files
if grep -qw "$users" "$file1" && grep -qw "$users" "$file2"; then
####This is for the affirmative sentence in only one file, and negative for the other one
if grep -qw "$users" "$file1" ! grep -qw "$users" "$file2"; then
é uma maneira correta de negar e afirmar as afirmações? pd Estou usando o shell KSH.
Agradeço antecipadamente.
Outra opção:
Tente isto:
grep
pode pesquisar padrões em vários arquivos, portanto, não é necessário usar um operador OR/NOT.Nota:
((n++))
é uma extensão ksh (também suportada porzsh
ebash
). Na sintaxe POSIXsh
, você precisarian=$((n + 1))
.Se seus nomes de arquivo não contiverem novas linhas, você pode evitar várias invocações
grep
fazendo com que o grep imprima os nomes dos arquivos correspondentes e conte os resultados.O número de partidas é
"${#matches[@]}"
.Pode haver uma maneira de usar
grep --null -lw
aqui, mas não tenho certeza de como analisar a saída . Bashvar=( array elements )
não tem como usar um\0
delimitador em vez de\n
. Talvez omapfile
builtin do bash possa fazer isso? Mas provavelmente não, porque você especifica o delimitador com-d string
.Você poderia
count=$(grep -l | wc -l)
, mas então você tem dois processos externos, então você pode apenas executargrep
os dois arquivos separadamente. (A diferença entre a sobrecarga de inicializaçãogrep
vs.wc
é pequena em comparação com as coisas de fork + exec + vinculador dinâmico para iniciar um processo separado).Além disso, com
wc -l
você não descobre qual arquivo correspondeu.Com os resultados capturados em uma matriz, isso já pode ser o que você deseja, ou se houver exatamente 1 correspondência, você pode verificar se foi a primeira entrada ou não.
$matches
é uma abreviação de${matches[0]}
, o primeiro elemento da matriz.