エイリアスパイプ入力awk

エイリアスパイプ入力awk

パイプをll使用してエイリアスを作成しようとしています。awk以下を使用してアポストロフィを避けようとしています。回答

alias lh= `ll -h | awk {'print  $9, \"-\" ,$5, \"-\", $8, \"-\",$7, $6'}` 

しかし、うまくいかないようです。

bashとのコンソール出力はzsh同じです。


awk: cmd. line:1: {print  $9, \"-\" ,$5, \"-\", $8, \"-\",$7, $6}
awk: cmd. line:1:             ^ backslash not last character on line
awk: cmd. line:1: {print  $9, \"-\" ,$5, \"-\", $8, \"-\",$7, $6}
awk: cmd. line:1:             ^ syntax error

入場時

alias lh= `ll -h | awk {'print  $9, "-" ,$5, "-", $8, "-",$7, $6'}`

出力は 空であることを意味します。

ベストアンサー1

エイリアス定義にはいくつかの構文問題があります。しかし、最初の問題は出力を解析することです。ls とても落胆これを含むコードは、最終的に空白、タブ、改行などの「マイナーでない」文字を含むファイルを誤って発見するためです。さらに、特にタイムスタンプの出力形式は、ファイルの実際の「古い」程度によって変更されることがあります。つまり、awk実際のファイルによっては、入力にスペースで区切られた「フィールド」が多いか少ない可能性があります。フィールドの変更(たとえば、「古いファイル」の年から「最近のファイル」の時間まで)この2つの側面は、@steeldriverがエイリアス「脆弱性」と呼ばれることです。

「明らかな」質問は次のとおりです。

  1. その後にスペースがあります=。これにより、エイリアスはlh未定義のままになります(少なくともbash)。
  2. エイリアス定義をバックティック(`)で囲むと、「3番目のレベル」参照を生成できます。ただし、逆引用符はコマンド代替構文です(現在は廃止されました)lhll | awk ...パイプラインコンソール出力そして実行しようそれコマンドで。
  3. ll存在するか少なくともエイリアスとして事前定義されたコマンドを使用していますls -l。これは事実かもしれませんし、そうでないかもしれません。
  4. プログラムawkは、誤った順序で一重引用符と中括弧で始まります。正しい構文はですawk ' { ... } '

これがシェルスクリプトの一部である場合は、次のように実行する必要があります。shellcheckは、多くのLinuxディストリビューションでスタンドアロンツールとして使用され、多くの構文関連のエラーをキャッチすることもできます。

問題に対する即時の解決策は、実際に正しい引用とエスケープです。次のことを試してみてください。

alias lh="ls -lh | awk '{print  \$9, \"-\" ,\$5, \"-\", \$8, \"-\",\$7, \$6}'"

ここで、エイリアスはのすべてのエントリであり" ... "、の入力はawk明示的に宣言されls -lhawkプログラムは一重引用符で囲まれ、プログラム内のフィールド参照は「エイリアスが定義されているときawk」の位置引数バックスラッシュエスケープによってシェルが早期解釈から保護されます。 (awkつまり、実際には$9空になる可能性があるシェルインスタンスの9番目の位置引数に置き換えられるのではなく、処理されます)。

しかし、

  • 以下で見つけた提案あなたがリンクした質問に対する答えの1つ- 関数を定義することは、「参照地獄」(@ilkkachuが述べたように)から抜け出すより良い方法です。

    lh() { ls -lh | awk '{print  $9, "-" ,$5, "-", $8, "-",$7, $6}'; }
    

    より明確で理解しやすい。

  • ls解析を完全に避け、次のベースfindエイリアスを使用することをお勧めします。

    lh() { find . -maxdepth 1 -type f ! -name ".*" -printf "%f - %s - %TY - %Td %Tb\n"; }
    

    printf書式設定オプションを使用して、find必要なファイル属性を確実に出力します。唯一の欠点は、-h人間が読めるサイズオプションがないことです。

    このフィルタは、隠しファイルを無視する標準的な動作をシミュレートする! -name ".*"ために使用されます。lsリストするには、このセクションを省略できます。

おすすめ記事