lsof | gawk '$ 4〜/ txt / {next}; / REG。* \(deleted \)$ / {printf“> / proc /%s / fd /%d \ n”、$ 2、$ 4}'コマンドの機能平均


9

私はいくつかの記事を読んでいて、このコマンドを見たことがあります。

lsof|gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

いくつかの体は私がそれを理解するのに役立ちますか


興味深い質問なので、+ 1とお気に入り。:-)
Lorenzo Ancora 2014年

回答:


7

このコマンドは、切り捨てが必要なファイルを出力lsofします。

(実際に、ファイルの削除や切り捨ては行わません)。

lsof 次のように処理するawkにパイプされるオープンファイル(ファイル記述子)のリストを返します。

gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

上記の式には、セミコロンで区切られた2つの正規表現が含まれています ;

最初の部分を考えてみましょう gawk '$4~/txt/{next};

ここで、4番目のフィールドが含まれている場合、txtテキストの次の行が読み取られ、スクリプトは最初から処理を開始します。

このnextステートメントは、awkに現在のレコードの処理をただちに停止させ、次のレコードに進むように強制します。つまり、現在のレコードに対してそれ以上のルールは実行されず、現在のルールの残りのアクションは実行されません。

では、スクリプトの2番目の部分を考えてみましょう /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

行が正規表現と一致する場合はここで/REG.*\(deleted\)$$手段(deleted)行の最後の単語でなければなりませんが)、それだけで印刷します>/proc/%s/fd/%d\n", $2,$4

lsofコマンドで$4は、ファイルに応じて、ファイル記述子番号(たとえば53wwファイラーが書き込み用に開かれたことを意味します)またはfiletypeです。の%dは、printf数字のみが印刷されるようにし、テキスト文字(などw)を削除します。$2ファイルを使用するプロセスのプロセスIDを出力して、次のように出力します。>/proc/3989/fd/53削除されたが、ファイル記述子が開いたままのすべてのファイル、つまり安全に切り捨てられるファイル記述子を出力します。


2

このコマンドは、lsofから削除されたファイルを切り捨てます。

これは最初に開いているファイルをリストしますlsof

次に、再帰的に1行検索し、次に4番目のパラメータとして{next}REGを含む行を検索する'$4~/txt/{next};/REG.*\(deleted\)$/と、この行に関連するこのプロセスが削除されます。

次に、REGを含み、削除済みとしてマークされた行を除くすべての結果を印刷します。{printf ">/proc/%s/fd/%d\n", $2,$4}'


コマンドのさまざまな部分を説明する必要があると思います(少なくとも私の賛成票を得るために)。
don.joey 2014年

私の更新をチェックしてください

1
正規表現と印刷ステートメントを含むawkステートメントが実際のコンテンツの切り捨てを開始したときsh。実際の切り捨てのためにこのコマンドをに渡す必要があります。さらに、説明にあるように、1つではない2つの正規表現
Stormvirux
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.