bir dosya arayın ve yalnızca bir koşul karşılandığında yeni bir dosya oluşturun


10

Bir günlük dosyası var ve bir dize ve yalnızca bu dize oluşturulacak yeni bir dosya bulunursa aramak istiyorum. Bunu nasıl başarabilirim, sed doenst bu durumda uygun görünüyor.


3
grepAramak için kullanın . Bu -qseçenek tüm çıktıları bastıracak ve grepkolayca test edilebilen çıkış kodu ile eşleşir / eşleşmiyor .
vals

2
Durumun ne olduğunu bize bildirmek faydalı olabilir.
j0h

Yanıtlar:


16

Aşağıdaki durumlarda kısa devre değerlendirmesi yapınız grep:

grep -q 'search_pattern' /file && : >/newfile
  • grep -qSTDOUT üzerinde çıktı üretmez 0, desen dosyada bulunursa çıkış durumundan çıkar

  • Desen bulunursa ( &&), /newfiletarafından bir dosya oluşturun : >/newfile.


Ayrıca her zamanki touch /newfileyaklaşımı tercih edebilir veya bashboş bir yönlendirme >/newfilede yapabilirsiniz.

Sadece, eğer dosya zaten varsa, o touchzaman dosyayı kesmeden sadece ilgili zaman damgalarını değiştirir. Ve boş yönlendirme >/newfilehareket zshhalindeyken EOF'u manuel olarak göndermeniz gereken hareket halindeki tüm mermilerde (örn . İçeride) desteklenmez.


Ne yapar :?
George Udosen

5
@George :kısaca true, her zaman çıkış durumu 0 ile çıkan bir op-olmayan komut.
heemayl

@heemayl Bu, bu güne kadar iyi çalıştı
Jacknife

6

Sadece eğlence için:

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

burada 'string'dize (koşul) 'logfile'ile değiştirilir, günlük 'newfile'dosyasına giden yolla değiştirilir, örnekte olduğu gibi tek tırnak içinde oluşturulacak gerçek dosya yolu ile değiştirilir.


4

Awk system()komutuyla kullanabilirsiniz . Eğer /pattern/bulunursa, kod bloğu {}yürütülür, bu durumda komut touch /tmp/my_file.txtyoluyla çağırırız system().

Aşağıdaki örnekte, kullanıcım varsa geçici bir dosya oluşturmayı gösterir /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

Alternatif olarak, yeniden yönlendirmeyi şu dosyaya kullanabiliriz:

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

0

Yeni bir boş dosya isteyip istemediğinizi veya dosyayı oluşturmak için daha karmaşık işlemlere ihtiyacınız olup olmadığını söylemezsiniz.

Eğer eski ise, @heemayl tarafından verilen cevap açıktır.

Aksi takdirde, bir if ifadesi kullanın:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.