条件が満たされた場合にのみ、ファイルを検索して新しいファイルを作成する


10

ログファイルがあり、文字列を検索したいのですが、その文字列が見つかった場合にのみ、新しいファイルが作成されます。どうすればこれを達成できますか。この場合、sed doenstが適しているようです。


3
grep検索に使用します。この-qオプションはすべての出力を抑制し、grepの終了コードを介して一致/不一致を返します。これは簡単にテストできます。
ワルティネーター2017年

2
状態を教えていただけると助かります。
j0h 2017年

回答:


16

次の後に短絡評価を行いgrepます。

grep -q 'search_pattern' /file && : >/newfile
  • grep -qSTDOUTに出力を生成せず0、パターンがファイルで見つかった場合に終了ステータスで終了します

  • パターンが(発見された場合&&)、ファイルを作成/newfileすることによってを: >/newfile


また、通常のtouch /newfileアプローチをとることもできますがbash、空のリダイレクト>/newfileを行うこともできます。

ただし、ファイルが既に存在する場合は、ファイルtouchを切り捨てることなく、関連するタイムスタンプのみを変更します。また、EOFを手動で送信する必要がある>/newfileすべてのシェル(たとえばzsh)で、空のリダイレクトはサポートされていません。


何をし:ますか?
ジョージウドセン2017年

5
@Georgeが:の省略形ですtrue、それはそれは常に終了ステータス0で終了ノーオペレーションコマンドだ
heemayl

@heemaylこれは今日まで最高に機能し
ました

6

ちょうど楽しみのために:

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

ここで、'string'は文字列(条件)で'logfile'置き換えられ、ログ'newfile'ファイルへのパスで置き換えられ、作成するファイルへの実際のパスで置き換えられます。例では、すべて一重引用符で囲まれています。


4

system()コマンドでawkを使用できます。場合は/pattern/発見され、コードブロックは、{}我々が呼ぶこの場合には、実行されますtouch /tmp/my_file.txt経由でsystem()コマンドを実行します。

次の例は、にユーザーがいる場合に一時ファイルを作成する方法を示しています/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

または、ファイルへのリダイレクトを使用することもできます。

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

0

新しい空のファイルが必要かどうか、またはファイルを作成するためにより複雑な処理が必要かどうかはわかりません。

前者の場合、@ heemaylによる返信が適切です。

それ以外の場合は、ifステートメントを使用します。

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.