cari file dan buat file baru hanya jika suatu kondisi terpenuhi

10

Saya memiliki logfile dan saya ingin mencari string dan hanya jika string tersebut ditemukan file baru yang akan dibuat. Bagaimana saya bisa mencapai ini, meskipun sepertinya cocok dalam kasus ini.

Jacknife
sumber
3
Gunakan grepuntuk mencari. The -qpilihan akan menekan semua output, dan kembali pertandingan / nonmatch melalui grep's kode keluar, yang mudah diuji.
waltinator
2
Mungkin bermanfaat untuk memberi tahu kami apa kondisinya.
j0h

Jawaban:

16

Tack evaluasi hubung singkat setelah grep:

grep -q 'search_pattern' /file && : >/newfile
  • grep -qtidak menghasilkan output pada STDOUT, hanya keluar dengan status keluar 0jika pola ditemukan pada file

  • Jika polanya ditemukan ( &&), buat file /newfiledengan : >/newfile.


Anda juga bisa menggunakan touch /newfilependekatan yang biasa , atau bashmelanjutkan, pengalihan kosong - >/newfilejuga bisa.

Sekadar diketahui, jika file sudah ada maka touchhanya akan mengubah stempel waktu yang relevan tanpa memotong file. Dan pengalihan kosong >/newfiletidak didukung pada semua shell on-the-go (misalnya di zsh), di mana Anda harus mengirim EOF secara manual.

heemayl
sumber
Apa yang :dilakukan?
George Udosen
5
@ George :adalah singkatan untuk true, itu adalah perintah no-op yang selalu keluar dengan status keluar 0.
heemayl
@heemayl Ini bekerja paling baik sampai hari ini
Jacknife
6

Hanya untuk bersenang-senang:

python3 -c "if 'string' in open('logfile').read(): open('newfile', 'wt')"

di mana 'string'digantikan oleh string (kondisi), 'logfile'digantikan oleh path ke file log, 'newfile'digantikan oleh path sebenarnya ke file untuk membuat, semua dalam tanda kutip tunggal, seperti dalam contoh.

Yakub Vlijm
sumber
4

Anda dapat menggunakan awk dengan system()perintahnya. Jika /pattern/ditemukan, kode kunci {}akan dieksekusi, dalam hal ini kita panggil touch /tmp/my_file.txtmelalui system()perintah.

Contoh di bawah ini menunjukkan membuat file sementara jika ada pengguna saya /etc/passwd.

$ awk '/xieerqi/{system("touch /tmp/my_file.txt")}' /etc/passwd

$ ls -l /tmp/my_file.txt
-rw-rw-r-- 1 xieerqi xieerqi 0 1月  25 07:58 /tmp/my_file.txt

Atau, kita dapat menggunakan pengalihan ke file:

 awk '/xieerqi/{f="/tmp/my_file.txt";print "" > f;close(f)}' /etc/passwd 
Sergiy Kolodyazhnyy
sumber
0

Anda tidak mengatakan apakah Anda menginginkan file kosong baru, atau jika Anda membutuhkan pemrosesan yang lebih kompleks untuk membuat file.

Jika yang pertama, balasan oleh @heemayl tepat.

Kalau tidak, gunakan pernyataan if:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
Paddy Landau
sumber