シェルから出力を抽出する

シェルから出力を抽出する

私がしている間

ls -la |grep -e Aug

私が得た結果は次のとおりです。

-rw-r--r--    1 root           staff   454 Oct 15 18:35 Aug.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 25 04:00 abc7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 26 07:00 def7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 27 10:00 ghi7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 28 13:00 jkl7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 29 16:00 mno7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 30 19:00 pqr7.txt

10月に作成された最初のファイルではなく、8月に作成されたファイルのみをリストしたいと思います。以下を出力する必要があります。

-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 25 04:00 abc7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 26 07:00 def7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 27 10:00 ghi7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 28 13:00 jkl7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 29 16:00 mno7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 30 19:00 pqr7.txt

また、ハードコードされた値ではなくユーザー入力として月を持ちたいと思います。

答え1

代替案を検討する必要があります分析するls今すぐいろんな罠がいっぱい。しかし、ここでのあなたの主な関心は列に基づいてフィルタリングする方法のようであり、最終的な目標はとにかく解析ではないls ので、あなたが使用している例(を使用ls)に従い続けます。しかし、これがls出力を解析するのが良いとは思わないでください。これは一般的に良いことではありません。

grepを検索すると、連続してAugどこでも検索できます。実際には、Aug位置を含む行を選択するのではなく、6番目の列の完全で正確なテキストを含む行のみを選択したいと思います。でもできるこれを行う方がgrep簡単で自然ですawk

ls -la | awk '$6 == "Aug"'

何らかの理由で本物これを行うには、次の操作をgrep行います。

ls -la | grep -E '(\S+\s+){5}Aug\s'

誰ですかまた興味があります6番目の列が読み取ったシェル変数の値と同じ行をフィルタリングしますmonth。あなたはこれがうまくいくことを観察しましたいいえ働く:

ls -la | awk '$6 == "$month"'   # does not work

うまくいかない理由はアポストロフィAWKスクリプトの周りの$6 == "$month"シェルの実行を防ぐパラメータ拡張$monthその値に置き換えてください。テキストは$monthそのまま渡されますがawk、これは望む内容ではありません。AWK変数とシェル変数は完全に別々です。awkこの問題を解決するためのクリーンで簡単な方法は、コマンドのオプションを使用してシェル変数からAWK変数を初期化することです-v

ls -la | awk -v m="$month" '$6 == m'

必要に応じて、AWK変数の名前をシェル変数と同じ名前で指定できます。同じことを示す場合、これは合理的な選択です。mシェル変数とAWK変数がどのように分離されるかを説明し、混乱を避けるためにAWK変数の名前を指定しました。 (長いまたは複雑なAWKスクリプトまたは変数が多いスクリプトの場合は、より説明的な方法で変数名を指定できますが、mこの場合は読みやすくなりません。)


上記のトピックをリンクしました。バッシュリファレンスマニュアル質問にタグを付けたため最も古いバージョンのOS X(現在macOSと呼ばれる)を除くすべてのバージョンのデフォルトのシェルはですbashtcsh

参考までに、monthコマンドを使用して値を入力として使用することに言及しましたread month。シェルのコマンドを使用するときは、代わりに書き込みのためにreadほぼ常にこのフラグを渡す必要があります。省略した場合のみ-rread -r month-r考えるread\受信した入力からエスケープされたコマンドを変換します(実際にはこれを望んでいません)。IFS= read -r month先行スペースと末尾のスペースを削除しないようにすることもできます。ただし、この場合は実際に削除したい場合がありますので省略できますIFS=

答え2

これは私にとって効果的です

ls -al | awk '$6 == "Aug" {print}'

関連情報