Saya memiliki file bernama hostlist.txt
yang berisi teks seperti ini:
host1.mydomain.com
host2.mydomain.com
anotherhost
www.mydomain.com
login.mydomain.com
somehost
host3.mydomain.com
Saya memiliki skrip kecil berikut:
#!/usr/local/bin/bash
while read host; do
dig +search @ns1.mydomain.com $host ALL \
| sed -n '/;; ANSWER SECTION:/{n;p;}';
done <hostlist.txt \
| gawk '{print $1","$NF}' >fqdn-ip.csv
Yang menghasilkan fqdn-ip.csv
:
host1.mydomain.com.,10.0.0.1
host2.mydomain.com.,10.0.0.2
anotherhost.internal.mydomain.com.,10.0.0.11
www.mydomain.com.,10.0.0.10
login.mydomain.com.,10.0.0.12
somehost.internal.mydomain.com.,10.0.0.13
host3.mydomain.com.,10.0.0.3
Pertanyaan saya adalah bagaimana cara menghapus .
sebelum koma tanpa meminta sed
atau gawk
lagi? Apakah ada langkah yang bisa saya lakukan dalam panggilan yang ada sed
atau gawk
yang akan menghapus titik?
hostlist.txt
akan berisi 1000-an host jadi saya ingin skrip saya menjadi cepat dan efisien.
shell-script
awk
sed
regular-expression
string
Linoob
sumber
sumber
dig +short
tidak berhasil untuk Anda?Jawaban:
The
sed
perintah,awk
perintah, dan penghapusan periode mengikuti semua dapat digabungkan ke dalam perintah awk tunggal:Atau, seperti tersebar di beberapa baris:
Karena
awk
perintah mengikutidone
pernyataan, hanya satuawk
proses yang dipanggil. Meskipun efisiensi mungkin tidak penting di sini, ini lebih efisien daripada menciptakan proses sed atau awk baru dengan setiap loop.Contoh
Dengan file tes ini:
Perintah menghasilkan:
Bagaimana itu bekerja
awk secara implisit membaca inputnya satu rekaman (baris) pada suatu waktu. Script awk ini menggunakan variabel tunggal
f
,, yang menandakan apakah baris sebelumnya adalah header bagian jawaban atau tidak.f{sub(/.$/,"",$1); print $1", "$NF; f=0}
Jika baris sebelumnya adalah tajuk bagian jawaban, maka
f
akan benar dan perintah di kurung kurawal dieksekusi. Yang pertama menghapus periode trailing dari bidang pertama. Yang kedua mencetak bidang pertama, diikuti oleh,
, diikuti oleh bidang terakhir. Pernyataan ketiga diatur ulangf
ke nol (salah).Dengan kata lain, di
f
sini berfungsi sebagai kondisi logis. Perintah dalam kurung kurawal dieksekusi jikaf
bukan nol (yang, dalam awk, berarti 'benar')./ANSWER SECTION/{f=1}
Jika baris saat ini berisi string
ANSWER SECTION
, maka variabelf
diatur ke1
(true).Di sini,
/ANSWER SECTION/
berfungsi sebagai kondisi logis. Ini bernilai true jika saat ini cocok dengan ekspresi regulerANSWER SECTION
. Jika ya, maka perintah di kurung kurawal di jalankan.sumber
f
variabel arbitrer atau merupakanf{}
bagian eksplisit dari fungsi awk?f
adalah variabel arbitrer. Anda benar-benar dapat menempatkan sebelum{}
kondisi logis yang kompleks.f
hanyalah kondisi logis yang sangat sederhana: memang benar jika bukan nol, salah jika nol./ANSWER SECTION/
memainkan peran kondisi logis, analog dengan peran yangf
dimainkan di perintah pertama. Saya telah memperbarui jawaban untuk membahas ini.dig
dapat membaca dalam file yang berisi daftar nama host dan memprosesnya satu per satu. Anda juga dapat memintadig
untuk menekan semua output kecuali bagian jawaban.Ini akan memberi Anda output yang Anda inginkan:
awk
'ssub()
Fungsi ini digunakan untuk mengupas periode literal.
dari akhir field pertama. Kemudianawk
mencetak bidang 1 dan 5 dipisahkan dengan koma.CATATAN: entri
hostlist.txt
yang tidak diselesaikan sepenuhnya dibuang - entri yang tidak muncul di stdout ATAU stderr.(Diuji di Linux dan FreeBSD)
sumber
Ubah permintaan Anda
gawk
menjadi sebagai berikut:sumber