私がしている間
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と呼ばれる)を除くすべてのバージョンのデフォルトのシェルはですbash
。tcsh
参考までに、month
コマンドを使用して値を入力として使用することに言及しましたread month
。シェルのコマンドを使用するときは、代わりに書き込みのためにread
ほぼ常にこのフラグを渡す必要があります。省略した場合のみ-r
read -r month
-r
考えるread
\
受信した入力からエスケープされたコマンドを変換します(実際にはこれを望んでいません)。IFS= read -r month
先行スペースと末尾のスペースを削除しないようにすることもできます。ただし、この場合は実際に削除したい場合がありますので省略できますIFS=
。
答え2
これは私にとって効果的です
ls -al | awk '$6 == "Aug" {print}'