Apa artinya lsof | gawk '$ 4 ~ / txt / {next}; / REG. * \ (Dihapus \) $ / {printf “> / proc /% s / fd /% d \ n”, perintah $ 2, $ 4}' berarti

9

Saya membaca beberapa artikel dan saya telah melihat perintah ini:

lsof|gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Bisakah seseorang membantu saya untuk memahaminya

Braiam
sumber
+1 & favorit karena ini pertanyaan yang menarik. :-)
Lorenzo Ancora

Jawaban:

7

Perintah ini akan mencetak file dari lsofyang perlu dipotong.

(Ini sebenarnya tidak menghapus atau memotong file apa pun).

lsof akan mengembalikan daftar file terbuka (deskriptor file) yang disalurkan ke awk yang memprosesnya sebagai berikut.

gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Ekspresi di atas berisi dua ekspresi reguler yang dipisahkan oleh titik koma ;

mari pertimbangkan bagian pertama gawk '$4~/txt/{next};

Di sini, jika bidang ke-4 berisi txtmaka baris teks berikutnya akan dibaca, yang skrip akan mulai memproses dari awal lagi.

The nextpasukan pernyataan awk untuk segera menghentikan proses rekor saat ini dan pergi ke record berikutnya. Ini berarti bahwa tidak ada aturan lebih lanjut yang dieksekusi untuk catatan saat ini, dan sisa tindakan aturan saat ini tidak dieksekusi.

Sekarang mari kita perhatikan bagian kedua dari skrip /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Di sini jika baris cocok dengan ekspresi reguler /REG.*\(deleted\)$( $berarti yang (deleted)seharusnya menjadi kata terakhir pada baris), itu hanya mencetak >/proc/%s/fd/%d\n", $2,$4.

Dalam perintah lsof $4adalah nomor deskriptor file (misalnya 53w, wcara filer telah dibuka untuk menulis) atau tipe file, tergantung pada file. The %ddalam printfmemastikan bahwa hanya angka-angka akan dicetak, menghapus setiap karakter teks (seperti w). $2mencetak id proses dari proses yang menggunakan file sehingga akan mencetak sesuatu seperti >/proc/3989/fd/53dan seterusnya akan mencetak semua file yang telah dihapus tetapi deskriptor file yang tetap terbuka, dengan kata lain, deskriptor file yang dapat dipotong dengan aman.

Stormvirux
sumber
2

Perintah ini akan memotong file yang dihapus dari lsof.

Ini pertama akan daftar file yang terbukalsof

kemudian cari baris secara rekursif satu lalu {next}yang berisi REG '$4~/txt/{next};/REG.*\(deleted\)$/sebagai parameter keempat maka proses ini relatif terhadap baris ini akan dihapus

dan kemudian mencetak semua hasil tanpa garis yang berisi REG dan ditandai sebagai dihapus.{printf ">/proc/%s/fd/%d\n", $2,$4}'


sumber
Saya pikir Anda harus menjelaskan bagian-bagian berbeda dari perintah (setidaknya untuk mendapatkan saya upvote).
don.joey
periksa pembaruan saya
1
Kapan pernyataan awk dengan regex dan staement cetak mulai memotong konten yang sebenarnya. Anda harus meneruskan perintah ini ke a shuntuk pemotongan aktual dan terlebih lagi ada dua ekspresi reguler di sana, tidak satu seperti dalam penjelasan Anda
Stormvirux