Unixプラットフォームでファイルにgrep
タブ(\ t)するにはどうすればよいですか?
GNU grepを使用する場合は、Perlスタイルの正規表現を使用できます。
grep -P '\t' *
トリックはsinglequotesの前に$記号を使うことです。これはcutや他のツールにも使えます。
grep $'\t' sample.txt
'\ t'メタ文字をgrepで動作させることはできませんでした。しかし私は2つの代替解決策を見つけました:
<Ctrl-V> <TAB>
を使う(Ctrl-Vを押してからtabを押す)foo | awk '/\t/'
一つの方法は(これはBashです)
grep -P '\t'
-P
はPerlの正規表現をオンにするので、\ tは機能します。
Userunwindが言うように、GNU grepに固有のものかもしれません。代わりに、シェル、エディタ、または端末でタブが許可されている場合は、そこにタブを文字通りに挿入します。
これはまさにあなたが探しているものではありませんが、あなたのケースではうまくいくかもしれません
grep '[[:blank:]]'
に相当
grep -P '[ \t]'
それでそれはSpaceとTabを見つけるでしょう。
注意してください、それは私のman grep
で宣伝されていませんが、それでも動作します
$ man grep |空白のgrep wc 0 0 0
式の中にタブを文字通りに挿入するもう1つの方法は、Bashであまり知られていない$'\t'
引用符を使用することです。
grep $'foo\tbar' # matches eg. 'foo<tab>bar'
(固定文字列を照合する場合は、 ' - F'モードでこれを使用できます。)
変数を使用すると、表記がもう少し読みやすく管理しやすくなることがあります。
tab=$'\t' # `tab=$(printf '\t')` in POSIX
id='[[:digit:]]\+'
name='[[:alpha:]_][[:alnum:]_-]*'
grep "$name$tab$id" # matches eg. `bob2<tab>323`
これに対処するには、基本的に2つの方法があります。
(推奨)grep(1)でサポートされている正規表現構文を使用してください。現代のgrep(1)はPOSIX 1003.2の正規表現構文の2つの形式をサポートしています:basic(時代遅れの)REと現代のRE。構文はそれぞれBSDとLinuxシステムの一部であるre_format(7)とregex(7)のmanページで詳細に記述されています。 GNU grep(1)は、pcre(3)ライブラリで提供されているPerl互換のREもサポートしています。
正規表現言語では、タブ記号は通常\t
アトムでエンコードされています。アトムは、Perl互換のRE(egrep
、GNU grep -E
)と同様にBSD拡張正規表現(BSD互換システムではpcregrep
、grep -P
)によってサポートされます。
基本的な正規表現もLinuxの拡張REも、明らかに\t
をサポートしていません。サポートしている正規表現言語(したがってsed(1)、awk(1)、およびpcregrep(1)の正規表現の違い)については、UNIXユーティリティのmanページを参照してください。
したがって、Linuxの場合:
$ grep -P '\t' FILE ...
BSD系システムでは:
$ egrep '\t' FILE ...
$ grep -E '\t' FILE ...
タブ文字をパターンに渡します。スクリプトファイルを編集すると、これは簡単です。
# no tabs for Python please!
grep -q ' ' *.py && exit 1
しかし、対話型シェルで作業するときは、シェルと端末の機能に依存して適切な記号を行に入力する必要があります。ほとんどの端末では、これはCtrl
+ V
キーの組み合わせで実行できます。これは、端末に次の入力文字を文字通りに扱うように指示します(V
は "逐語"用です)。
$ grep '<Ctrl>+<V><TAB>' FILE ...
シェルによっては、コマンドの組版を高度にサポートしている場合があります。そのため、bash(1)では$'string'
という形式の単語が特別に扱われます。
bash$ grep $'\t' FILE ...
ただし、コマンドラインではNiceですが、スクリプトが別のプラットフォームに移動されるときに互換性の問題が生じる可能性があります。また、スペシャルを使用するときは引用符に注意してください。詳細についてはbash(1)を参照してください。
Bourne Shellでは(だけではなく)、同じ動作をprintf(1)で強化されたコマンド置換を使用してエミュレートし、適切な正規表現を構築することができます。
$ grep "`printf '\t'`" FILE ...
Echoを使ってタブを挿入してくださいgrep "$(echo -e \\t)"
grep "$(printf '\t')"
は私のためにMac OS Xで働いていました
(この古典的な sedチュートリアル で説明されているように) 'grepとしてsedを使用することをお勧めします。
sed -n 's/pattern/&/p' file
例(bash、sh、ksh、cshなどで動作します):
[~]$ cat testfile
12 3
1 4 abc
xa c
a c\2
1 23
[~]$ sed -n 's/\t/&/p' testfile
xa c
a c\2
[~]$ sed -n 's/\ta\t/&/p' testfile
a c\2
gawkを使用して、フィールド区切り文字をタブ(\ t)に設定し、フィールド数を確認してください。複数ある場合は、タブがあります。
awk -F"\t" 'NF>1' file
+1の方法、ksh、dashなどで動作します。TABを挿入するにはprintfを使用します。
grep "$(printf 'BEGIN\tEND')" testfile.txt
grep "$(echo -e '\t')"
を使いたいかもしれません
バックスラッシュのエスケープを解釈できるのは、echo
だけです。
私が使ったksh
grep "[^I]" testfile
答えはもっと簡単です。あなたのgrepを書き、引用符の中にタブキーを書いてください、それは少なくともkshではうまくいきます。
grep " " *
他の答えで与えられている$ '\ t'表記はシェル特有です - それはbashとzshで動作するようですが普遍的ではありません。
注:以下はfish
シェル用で、bashでは機能しません。
fish
シェルでは、引用符なしの\t
を使うことができます。例えば:
grep \t foo.txt
あるいは、16進表記やUnicode表記を使うこともできます。
grep \X09 foo.txt
grep \U0009 foo.txt
(これらの表記法はより難解な文字に役立ちます)
これらの値は引用符で囲まなくてはならないので、引用符で囲まれた値と引用符で囲まれていない値を連結によって組み合わせることができます。
grep "foo"\t"bar"
これらの二者択一的同定方法は完全に機能的である。そして、私はawkを使っているのがとても好きです。シングルバイナリ文字での構文の使い方を思い出せないからです。しかし、シェル変数にPOSIXの移植性のある方法で値を代入し(TAB = echo "@" | tr "\100" "\011"
)、それをPOSIXの移植性のある方法でいたるところで使用することも可能です。同様に(すなわちgrep "$ TAB"ファイル名)。この解決法はTABでもうまくいきますが、( 'tr'へのTAB文字の値の代わりに)他の望ましいバイナリ値が代入で使われるとき、他のバイナリ文字でもうまくいきます。
これはAIXではうまく機能します。 JOINED<\t>ACTIVE
を含む行を探しています
voradmin cluster status | grep JOINED$'\t'ACTIVE
vorudb201 1 MEMBER(g) JOINED ACTIVE
*vorucaf01 2 SECONDARY JOINED ACTIVE
'sed-as-grep'メソッドを使用しますが、タブを個人的な好みの目に見える文字に置き換えるのが私のお気に入りの方法です。
sed -n 's/\t/\*\*\*\*/g' file_name
行/ファイル情報や他のgrepオプションを使いたいが、タブ文字の代わりに見えるものを見たい場合は、次のようにして実現できます。
grep -[options] -P '\t' file_name | sed 's/\t/\*\*\*\*/g'
例として:
$ echo "A\tB\nfoo\tbar" > test
$ grep -inH -P '\t' test | sed 's/\t/\*\*\*\*/g'
test:1:A****B
test:2:foo****bar
編集:明らかに上記はタブを見つけるためにファイルの内容を見るためにのみ有用です - 目的がより大きなスクリプトセッションの一部としてタブを扱うことであるなら、これは少しの役に立つ目的にも役立ちません。