web-dev-qa-db-ja.com

パイプコマンド "l | grep" 1 ""が間違った結果を得るのはなぜですか?

図が示すように、lを使用して、現在のフォルダー内のファイルを取得します。そして、番号1のファイルを取得したいので、pipegrepを使用します。

しかし、なぜ2および22ファイルが表示されるのでしょうか? 1;34mとは何ですか?

$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22

更新

lファイルでコマンドzshrcのエイリアスを既に作成しています。

 alias lsp="ls"
 alias ll='ls -alF'
 alias la='ls -A'
 alias l='ls -CF'
 alias ls="ls -alh --color"

そして、これはtypeコマンドの結果です:

>$ type ls
ls is an alias for ls -alh --color

> $ type l
l is an alias for ls -CF
13
Lee

まず第一に、あなたがやろうとしていること、l| grep <filename>は悪いです。しないでください。その理由は次のとおりです。

lコマンドは、実際にはls -CFのエイリアスです

$ type -a l
l is aliased to `ls -CF'

Ubuntuのbashのデフォルトでは、lsls --color=autoのエイリアスです。スチールドライバーがコメントで指摘したように、--color=autoは色付けをオフにするはずです。あなたの特定のケースでは、alias ls="ls -alh --color"alias l="ls -CF"があり、これらは基本的にls -alh --color -CFになります。この特定のスイッチの組み合わせは、色付きの出力をパイプ経由で送信します。例えば:

$ ls -alh --color -CF ~/TESTDIR | cat -A                                                                                 
^[[0m^[[01;34m.^[[0m/  ^[[01;34m..^[[0m/  1.txt  2.txt  3.txt  out.txt$

.ディレクトリと..ディレクトリのエスケープシーケンスが同じであることに注意してください。

これはどういう意味ですか

つまり、lは、ファイルの種類に応じて色分けされたファイルのリストを出力します。問題は、 エスケープシーケンス を使用すると色付けが発生することです。それが1:34mのことです-特定の色のエスケープシーケンスです。

主な問題は、単純にlsが前述のようなエスケープシーケンスや他の特殊文字を許可するため、lsの解析がスクリプトの誤った出力と障害につながることです。詳細については、この記事を参照してください: http://mywiki.wooledge.org/ParsingLs

あなたがすべきこと:

findコマンドを使用します。

bash-4.3$ ls
1.txt  2.txt  3.txt  out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt

Shell globとモダンテスト[[コマンドを使用して、次のようなことができます。

bash-4.3$ for file in * ;do if [[ "$file" =~ "1"  ]] ;then echo "$file" ;fi ; done
1.txt

または、bash単独よりもはるかに優れたファイル名処理機能を持つpythonを使用することもできます。

bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']

lsの出力を処理する必要がない場合は、lsを使用した単純なグロブ処理も実行できます。 (これはファイルのリストを表示するためだけであり、出力テキストを処理するために別のプログラムに渡すためではありません)

bash-4.3$ ls *1*
1.txt
27

lおよびlsコマンドはエイリアスとして設定されます。

grep "1"を使用して)|を介して出力をパイピングすると、1が表示される各画面行が表示され、1が赤色になります。

ファイル名...2、および22は同じ画面行に表示されるため、grepによっても出力されますが、grepの一致を示す赤では表示されません。

:34mは、適切にペイントされない色のエスケープシーケンスです。 type -a lおよびtype -aの出力を含む修正された質問に基づいて、私のシステムで再現できます。エイリアスを--colorから--color=autoに変更する必要があることに注意してください。

カラー出力

color ls

6

トライアルでは、lsエイリアス、つまり、1;34mおよびカラーリングから生じる同様のノイズを呼び出していました。パイプ|はこれをすべて同じ行で受け取るため、grepはその行のファイル1と一致し、この行を出力します。これは画面に表示されるものです。

あなたがそのようなことをしているとき、システムコマンドに戻って行ごとに1つの結果を返すことは常に良いことです。

エイリアスを削除するには、\lsと入力し、オプション-1を使用して、改行で区切られた結果を出力します。

$ \ls -1 | grep "1"
1
11

注:バックスラッシュメソッドはすべてのコマンドで機能します。\commandは、エイリアスされていないシステムコマンドを呼び出すだけです。

1
pilko