grep -A1 'blah' logfile
Berkat perintah ini untuk setiap baris yang memiliki 'bla' di dalamnya, saya mendapatkan output dari baris yang berisi 'bla' dan baris berikutnya yang mengikuti di logfile. Mungkin yang sederhana tapi saya tidak bisa menemukan cara untuk menghilangkan baris yang memiliki 'bla' dan hanya menampilkan baris berikutnya di output.
-A1
opsicurl whatismyip.org | grep -A1 'Your IP Address'
-A1
. Terima kasih!Jawaban:
Anda dapat mencoba dengan awk:
sumber
awk '/blah/{getline; getline; print}' logfile
jika Anda ingin tetap berpegang pada grep:
atau
sumber
Piping adalah temanmu ...
Gunakan
grep -A1
untuk menunjukkan baris berikutnya setelah pertandingan, lalu kirimkan hasilnya ketail
dan hanya ambil 1 baris,sumber
Jawaban yang bagus dari raim, sangat berguna bagi saya. Sangat sepele untuk memperluas ini untuk mencetak misalnya garis 7 setelah pola
sumber
Jika baris berikutnya tidak pernah berisi 'bla', Anda dapat memfilternya dengan:
Penggunaan
cat logfile | ...
tidak diperlukan.sumber
Secara umum, saya setuju Anda meminta banyak grep di sini, dan bahwa alat lain mungkin solusi yang lebih baik. Tetapi dalam lingkungan yang tertanam, saya mungkin tidak ingin
sed
atauawk
hanya melakukan ini. Saya menemukan solusi berikut ini berfungsi (asalkan tidak cocok secara bersamaan):Pada dasarnya, cocokkan mereka, tambahkan 1 baris konteks untuk setiap pertandingan, dan kemudian pipa itu melalui kecocokan terbalik dari pola asli Anda untuk menghapusnya. Ini tentu saja berarti Anda dapat mengasumsikan bahwa pola Anda tidak muncul di baris "berikutnya".
sumber
Banyak jawaban baik telah diberikan untuk pertanyaan ini sejauh ini, tetapi saya masih merindukannya dengan
awk
tidak menggunakangetline
. Karena, secara umum , tidak perlu digunakangetline
, saya akan menggunakan:atau
Logikanya selalu terdiri dari menyimpan garis di mana "bla" ditemukan dan kemudian mencetak garis-garis yang satu baris setelahnya.
Uji
File sampel:
Dapatkan semua kalimat setelah "bla". Ini mencetak "bla" lain jika muncul setelah yang pertama.
Dapatkan semua baris setelah "bla" jika tidak mengandung "bla" sendiri.
sumber
Saya tidak tahu cara untuk melakukan ini dengan grep, tetapi dimungkinkan untuk menggunakan awk untuk mencapai hasil yang sama:
sumber
perl satu peringatan liner
hanya untuk bersenang-senang ... hanya mencetak satu baris setelah pertandingan
bahkan lebih menyenangkan ... cetak sepuluh baris berikutnya setelah pertandingan
agak curang karena sebenarnya ada dua perintah
sumber
$. == $next && print
sama denganprint if $. == $next
grep -A1
). Jika Anda ingin mencetak hanya baris berikutnya tetapi tidak pernah baris dengan korek api, maka Anda akan tetap memesan ini. (Hanya mencatat bagaimana $ berikutnya akan musnah untuk pertandingan berturut-turut)Sepertinya Anda menggunakan alat yang salah di sana. Grep tidak secanggih itu, saya pikir Anda ingin menjadi awk sebagai alat untuk pekerjaan itu:
awk '/blah/ { getline; print $0 }' logfile
Jika Anda mendapatkan masalah, beri tahu saya, saya pikir perlu belajar sedikit awk, ini alat yang hebat :)
ps Contoh ini tidak memenangkan 'penggunaan kucing yang tidak berguna';) http://porkmail.org/era/unix/award.html
sumber
grep / Pola / | tail -n 2 | kepala -n 1
Buntut yang pertama 2 dan kemudian yang terakhir untuk mendapatkan garis pertama yang tepat setelah pertandingan.
sumber