回答:
このコマンドは、切り捨てが必要なファイルを出力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は、ファイルに応じて、ファイル記述子番号(たとえば53w、wファイラーが書き込み用に開かれたことを意味します)またはfiletypeです。の%dは、printf数字のみが印刷されるようにし、テキスト文字(などw)を削除します。$2ファイルを使用するプロセスのプロセスIDを出力して、次のように出力します。>/proc/3989/fd/53削除されたが、ファイル記述子が開いたままのすべてのファイル、つまり安全に切り捨てられるファイル記述子を出力します。
このコマンドは、lsofから削除されたファイルを切り捨てます。
これは最初に開いているファイルをリストしますlsof
次に、再帰的に1行検索し、次に4番目のパラメータとして{next}REGを含む行を検索する'$4~/txt/{next};/REG.*\(deleted\)$/と、この行に関連するこのプロセスが削除されます。
次に、REGを含み、削除済みとしてマークされた行を除くすべての結果を印刷します。{printf ">/proc/%s/fd/%d\n", $2,$4}'
sh。実際の切り捨てのためにこのコマンドをに渡す必要があります。さらに、説明にあるように、1つではない2つの正規表現