Saya ingin mencari beberapa string dalam dua file. Jika satu string ditemukan di kedua file, maka buat sesuatu. Jika satu string ditemukan hanya dalam satu file, maka buatlah hal lain.
Perintah saya adalah yang berikut:
####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
apakah ini cara yang benar untuk menolak dan menegaskan pernyataan? pd saya menggunakan shell KSH.
Terima kasih sebelumnya.
text-processing
awk
grep
ksh
Mareyes
sumber
sumber
Pilihan lain:
sumber
Catatan:
((n++))
adalah ekstensi ksh (juga didukung olehzsh
danbash
). Dalamsh
sintaks POSIX , Anda akan membutuhkannyan=$((n + 1))
.sumber
n=$((n++))
tidak pernah akan mengubah nilai n karenan++
adalah posting kenaikan: ia mengembalikan nilai saat n, maka kenaikan n; maka Anda mengatur variabel ke nilai yang dikembalikan yang asli n.local IFS=$'\n'; matches=( $(grep -lw "$users" "$file1" "$file2") )
,, dan gunakancase "${#matches[@]" in
. @glenn: ide ini berlaku untuk jawaban Anda juga, untuk menghindari beberapa pemanggilangrep
. Menyalurkannyagrep -l | wc -l
juga akan berhasil.Jika nama file Anda tidak mengandung baris baru, Anda dapat menghindari beberapa pemanggilan
grep
dengan meminta cetak nama file yang cocok, dan hitung hasilnya.Jumlah kecocokan adalah
"${#matches[@]}"
.Mungkin ada cara untuk digunakan di
grep --null -lw
sini, tapi saya tidak yakin bagaimana mem-parsing output . Bashvar=( array elements )
tidak memiliki cara untuk menggunakan\0
pembatas alih-alih\n
. Mungkinmapfile
built bash bisa melakukannya? Tapi mungkin tidak, karena Anda menentukan pembatas dengan-d string
.Anda bisa
count=$(grep -l | wc -l)
, tetapi kemudian Anda memiliki dua proses eksternal sehingga Anda mungkin juga menjalankangrep
dua file secara terpisah. (Perbedaan antara overhead startupgrep
vswc
kecil dibandingkan dengan fork + exec + hal-hal linker dinamis untuk memulai proses yang terpisah sama sekali).Juga, dengan
wc -l
Anda tidak menemukan file mana yang cocok.Dengan hasil yang ditangkap dalam sebuah array, itu mungkin sudah seperti yang Anda inginkan, atau jika ada 1 yang cocok, Anda dapat memeriksa apakah itu input pertama atau tidak.
$matches
adalah singkatan untuk${matches[0]}
, elemen array pertama.sumber
-z
, bukan-0
, oops. Ya itu akan mendapatkan grep untuk mencetak nama file yang dipisahkan oleh\0
seperti yang telah saya sebutkan dalam jawaban, tetapi bagaimana Anda bisa mendapatkan bash untuk menguraikan itu? Anda tidak dapat mengaturIFS=$'\0'
, atau pada dasarnya melakukan hal lain denganfind -print0
keluaran gaya langsung dengan bash.grep
yang harus diselesaikan.mapfile -d $'\0'
semacam karya, tetapi menggantikan baris baru dengan spasi (saya belum mencoba tweakerIFS
).