60052


Unix環境で、タブ文字（`"\t"`）を `grep` するにはどうすれば良いですか？

`grep "\\t"` や `grep '\t'` だと `t` で検索されてしまい上手くいきませんでした。


CC BY-SA 4.0
2019-10-28T18:01:18.187
60051
2019-10-30T01:22:23.190
19110
question
unix grep
タブ文字をgrepしたい


Bash であれば、シングルクォートの前にドル記号を入れた `$'...'` 形式の文字列の中に `\t` を入れると Bash
がタブ文字として解釈してくれます。

[code]

    grep $'\t'
    
[/code]

参考

  * Bash マニュアル [3.1.2.4 ANSI-C Quoting](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#ANSI_002dC-Quoting)
  * 英語版 Stack Overflow の質問 ["grep a tab in UNIX"](https://stackoverflow.com/q/1825552/5989200) に対する [antimirov さんの回答](https://stackoverflow.com/a/5694596/5989200)


CC BY-SA 4.0
2019-10-28T18:01:18.187
60052
2019-10-29T00:45:53.320
2019-10-29T00:45:53.320
19110
19110
60051
answer


`grep $'\t'`の方がスマートですが他の制御コードにも使える方法です。

[code]

    grep "$(echo -n -e \\x09)"
    
[/code]

昔風の書き方なら

[code]

    grep "`echo -n -e \\\x09`"
    
[/code]

試した環境  
GNU bash, バージョン 4.4.20(1)-release (x86_64-pc-linux-gnu)  
grep (GNU grep) 3.1


CC BY-SA 4.0
2019-10-29T03:46:36.733
60063
2019-10-29T03:46:36.733
35558
60051
answer


もし、ターミナル上での話であれば(シェルが起動していてコマンド待ち状態であれば)、  
`Ctrl` \+ `v` → `Tab` の順番でキー入力すればタブ文字が直接入力できます。  
この方法はbashでない多くのシェルで適用できると思います。

[code]

    $ grep '[CTRL+v][TAB]' files*
    
[/code]

(見た目上はスペースとタブの区別はつかないのでターミナル上では下のような感じに見えます。)

[code]

    $ grep '  ' files*
    
[/code]

シェルスクリプトの中で使用するのならエディタ上でスペースとタブは区別しづらかったり、  
タブ→スペース変換等で誤って消されてしまう可能性があるので、  
おすすめしません。  
他の方が回答している方法でやるのが良いかと思います。


CC BY-SA 4.0
2019-10-30T01:13:15.330
60099
2019-10-30T01:22:23.190
2019-10-30T01:22:23.190
3060
30745
60051
answer