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


10

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

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

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


1
レコードの場合、[...]構成は単一の文字に一致します。これは、大括弧内の任意の文字にすることができます。そのため、式はJJA or JugJfrom [Jun]ufrom [Jul]gfrom [Aug])に一致しますが、一致させたいと思っていた月の省略形には一致しません。
tripleee 2015年

回答:


12

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

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

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


1
awkは拡張正規表現を理解するので、次のように書くのと同じくらい単純なパターンのawk '/Jun|Jul|Aug/'場合awk '/Ju[nl]|Aug/'
cas

5

原則として、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

これも良い例です。これまでにSTATを確認したことはありません。素晴らしい情報をありがとう
OmiPenguin

たぶん... | awk '$NF ~ /2013-0[678]/'に変更して、日付が一致しない場合でも、ファイルが正規表現と一致する(そうではない?)であっても、最後の出力フィールドのみをチェックします。
tripleee 2015年

3

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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.