web-dev-qa-db-ja.com

AWKコマンドで複数の検索を追加する方法

6月、7月、8月に作成されたファイルを検索しようとしています。私はこの方法を使いました

ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'

しかし、それは機能していません。

10
OmiPenguin

次のように複数のパターンで照合できます。

awk '/Jun/ || /July/ || /Aug/' <(ls -lrh)

これは、6月、7月、または8月のすべての一致を返します。printのデフォルトアクションであるため、awkステートメントは必要ありません。

12
jasonwryan

原則として、 lsの出力を解析 するのは非常に悪い考えです。あなたが望むことをするより良い方法は

stat -c "%n %y" * | grep 2013-0[678]

または、最後のフィールドのみを確​​認して、ファイル名自体が日付であるというまれなケースから保護します。

stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/' 

man stat

   -c  --format=FORMAT
          use the specified FORMAT instead of the default; output  a  new‐
          line after each use of FORMAT

   %y     time of last modification, human-readable
   %n     file name
5
terdon

lsは、人間が読める形式でファイルに関する情報を表示するコマンドです。 スクリプトでは使用しないでください

特定の基準に一致するディレクトリツリー内のファイルを検索するコマンドは find です。 GNU find(つまり非組み込みLinuxまたはCygwin)またはFreeBSD find(つまりFreeBSDまたはOSX)がある場合、-newermtを使用して、特定の日付。

find . -newermt '1 June' ! -newermt '1 September' -print

スクリプトを実行するときの暦年ではなく、特定の年のファイルを照合する場合は、年を追加します。

検索の実装に-newermtがない場合は、-newerを使用して、findが検出したファイルの日付を固定ファイルと比較する必要があります。 touchを使用して、境界として使用する日付の一時ファイルを作成します。

dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"