Eşleşen satırları bir dosyaya ve eşleşmeyen satırları farklı bir dosyaya nasıl yeniden yönlendirebilirim?


13

Aşağıdaki gereksinim için en iyi duruma getirilmiş bir komut dosyası / program / yardımcı program var mı?

someCommand |
   tee >(grep "pattern" > LinesWhichMatch) |
   grep -v "pattern" > LinesWhichDoesNotMatch

Yanıtlar:


16

Bunun için kullanabilirsiniz awk.

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'

1
Tamamen tanıdık değilim awkama hangi noktada >?
Koşulun

1
@Shadur >, mevcut dosyaların üzerine yazarak tüm çıktıları dosyaya yazdırır. Aynı örneğe ait eski çıktının üzerine yeni satır yazılmasına neden olacak şekilde değerlendirilmez awk. Diğer bir deyişle, birden fazla eşleşme varsa, "eşleşme" dosyası her bir eşleşmenin birbirinden ayrı olduğunu içerir OFS. Varolan dosyaların tedavisinde >ve >>varlığındaki fark .
Chris Down

10

İşte bir sedörnek:
Not: sed wkomutu, komut dosyası her çalıştırıldığında mevcut bir dosyanın üzerine yazacaktır, ancak yalnızca bu yazma komutu tetiklendiğinde; dolayısıylarm

rm -f file-{yes,not}  
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file

Güzel. Dallanma olmadan:sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti

6

Awk ile dosya ekleyebilirsiniz:

awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

veya daha kısa:

awk '{print >>(/pattern/?"matched":"unmatched")}'

Örneği, varsa dosya eklemek yerine dosyaların üzerine yazmak istediğini göstermektedir.
Chris Down
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.