it-swarm.com.de

grep ein Tab in UNIX

Wie kann ich die Registerkarte grep (\ t) in Dateien auf der Unix-Plattform verwenden?

387

Wenn Sie GNU grep verwenden, können Sie den regulären Ausdruck im Perl-Stil verwenden:

grep -P '\t' *
353
unwind

Der Trick besteht darin, das $ -Zeichen vor einfachen Anführungszeichen zu verwenden. Es funktioniert auch für geschnittene und andere Werkzeuge.

grep $'\t' sample.txt
293
antimirov

Ich habe es nie geschafft, das Metazeichen '\ t' mit grep zum Laufen zu bringen. Ich fand jedoch zwei alternative Lösungen:

  1. Mit <Ctrl-V> <TAB> (drücke Strg-V und tippe dann die Tabulatortaste)
  2. Awk benutzen: foo | awk '/\t/'
82
SamK

Von diese Antwort auf Ubuntu fragen:

Weist grep an, die von Perl definierten regulären Ausdrücke zu verwenden (Perl hat \t als Registerkarte):

grep -P "\t" <file name>

Verwenden Sie das Literal-Tabulatorzeichen:

grep "^V<tab>" <filename>

Verwenden Sie printf, um ein Tabulatorzeichen für Sie zu drucken:

grep "$(printf '\t')" <filename>
43
Poo

Ein Weg ist (das ist mit Bash)

grep -P '\t'

-P aktiviert reguläre Perl-Ausdrücke, damit\t funktioniert.

Wie der Benutzer nwind sagt, kann es spezifisch sein für GNU grep. Die Alternative ist, buchstäblich einen Tabulator einzufügen, wenn die Shell, der Editor oder das Terminal dies zulassen.

30
tjmoore

Eine andere Möglichkeit, den Tabulator buchstäblich in den Ausdruck einzufügen, ist die Verwendung des weniger bekannten $'\t' Zitat in Bash:

grep $'foo\tbar'        # matches eg. 'foo<tab>bar'

(Beachten Sie, dass Sie diese Option im '-F'-Modus verwenden können, wenn Sie feste Zeichenfolgen suchen.)

Manchmal kann die Verwendung von Variablen die Notation ein wenig lesbarer und übersichtlicher machen:

tab=$'\t'               # `tab=$(printf '\t')` in POSIX
id='[[:digit:]]\+'
name='[[:alpha:]_][[:alnum:]_-]*'
grep "$name$tab$id"     # matches eg. `bob2<tab>323`
10
Alois Mahdal

Dies ist nicht genau das, wonach Sie suchen, könnte aber in Ihrem Fall funktionieren

grep '[[:blank:]]'

Gleichwertig

grep -P '[ \t]'

So findet es Platz und Tab.

§ Zeichenklassen

Beachten Sie, dass es in meinem man grep Nicht beworben wird, aber trotzdem funktioniert

 $ man grep | grep blank | wc 
 0 0 0 
10
Steven Penny

Grundsätzlich gibt es zwei Möglichkeiten, dies zu beheben:

  1. (Empfohlen) Verwenden Sie die von grep (1) unterstützte Syntax für reguläre Ausdrücke. Modern grep (1) unterstützt zwei Formen der Regex-Syntax von POSIX 1003.2: grundlegende (veraltete) REs und moderne REs. Die Syntax wird in den Manpages re_format (7) und regex (7) beschrieben, die Teil von BSD- bzw. Linux-Systemen sind. Das GNU grep (1) unterstützt auch Perl-kompatible REs, wie sie von der pcre (3) -Bibliothek bereitgestellt werden.

    In der Regex-Sprache wird das Tabulatorsymbol normalerweise durch das Atom \t Codiert. Das atom wird von BSD-erweiterten regulären Ausdrücken (egrep, grep -E Auf BSD-kompatiblen Systemen) sowie von Perl-kompatiblen REs (pcregrep, GNU grep -P).

    Sowohl einfache reguläre Ausdrücke als auch erweiterte Linux-REs unterstützen anscheinend den \t Nicht. Informationen zur unterstützten Regex-Sprache (daher der Unterschied zwischen regulären Ausdrücken sed (1), awk (1) und pcregrep (1)) finden Sie in der Manpage zum UNIX-Dienstprogramm.

    Daher unter Linux:

    $ grep -P '\t' FILE ...
    

    Auf BSD-ähnlichen Systemen:

    $ egrep '\t' FILE ...
    $ grep -E '\t' FILE ...
    
  2. Übergeben Sie das Tabulatorzeichen in Muster. Dies ist unkompliziert, wenn Sie eine Skriptdatei bearbeiten:

    # no tabs for Python please!
    grep -q '   ' *.py && exit 1
    

    Wenn Sie jedoch in einer interaktiven Shell arbeiten, müssen Sie sich möglicherweise auf die Shell- und Terminalfunktionen verlassen, um das richtige Symbol in die Zeile einzugeben. Bei den meisten Terminals kann dies über die Tastenkombination Ctrl + V erfolgen, mit der das Terminal angewiesen wird, das nächste Eingabezeichen wörtlich zu behandeln (das V steht für "wörtlich"):

    $ grep '<Ctrl>+<V><TAB>' FILE ...
    

    Einige Shells bieten möglicherweise erweiterte Unterstützung für den Befehlssatz. In bash (1) werden Wörter der Form $'string' Besonders behandelt:

    bash$ grep $'\t' FILE ...
    

    Beachten Sie jedoch, dass dies zu Kompatibilitätsproblemen führen kann, wenn das Skript auf eine andere Plattform verschoben wird. Seien Sie auch vorsichtig mit Anführungszeichen, wenn Sie die Specials verwenden. Weitere Informationen finden Sie in bash (1).

    Für die Bourne-Shell (und nicht nur) kann dasselbe Verhalten mithilfe einer durch printf (1) erweiterten Befehlssubstitution emuliert werden, um einen korrekten regulären Ausdruck zu erstellen:

    $ grep "`printf '\t'`" FILE ...
    
6
Mike Volokhov

Verwenden Sie echo, um den Tabulator für Sie einzufügen grep "$(echo -e \\t)"

6
vanjoe

grep "$(printf '\t')" hat unter Mac OS X funktioniert

4
kumar303

Eine gute Wahl ist die Verwendung von 'sed as grep' (wie in diesem klassischen sed tutorial erklärt).

sed -n 's/pattern/&/p' file

Beispiele (funktioniert in 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
2
Julio

verwenden Sie gawk, setzen Sie das Feldtrennzeichen auf tab (\ t) und überprüfen Sie die Anzahl der Felder. Bei mehr als 1 gibt es/gibt Registerkarten

awk -F"\t" 'NF>1' file
2
ghostdog74

+1 Weg, der in ksh, dash, etc funktioniert: benutze printf um TAB einzufügen:

grep "$(printf 'BEGIN\tEND')" testfile.txt
1

Möglicherweise möchten Sie grep "$(echo -e '\t')" verwenden.

Einzige Voraussetzung ist, dass echo in der Lage ist, Backslash-Escapes zu interpretieren.

0
kshpolvind

Auf ksh habe ich verwendet

grep "[^I]" testfile
0
AIXroot

Die Antwort ist einfacher. Schreiben Sie Ihr grep und innerhalb des Anführungszeichens die Tabulatortaste, es arbeitet gut mindestens in ksh

grep "  " *
0
YullyBear

Die in anderen Antworten angegebene $ '\ t'-Notation ist Shell-spezifisch - sie scheint in bash und zsh zu funktionieren, ist jedoch nicht universell.

HINWEIS: Folgendes gilt für die fish Shell und funktioniert nicht in bash:

In der fish Shell kann man ein nicht zitiertes \t, beispielsweise:

grep \t foo.txt

Oder man kann die Hex- oder Unicode-Notationen verwenden, z.

grep \X09 foo.txt
grep \U0009 foo.txt

(Diese Notationen sind nützlich für esoterischere Charaktere)

Da diese Werte nicht in Anführungszeichen gesetzt sein müssen, können Sie Werte in Anführungszeichen und Werte in Anführungszeichen setzen, indem Sie Folgendes verketten:

grep "foo"\t"bar"
0
Raman

Diese alternativen binären Identifikationsmethoden sind voll funktionsfähig. Und ich mag es wirklich, wenn jemand awk verwendet, da ich mich nicht genau an die Syntaxverwendung mit einzelnen Binärzeichen erinnern kann. Es sollte jedoch auch möglich sein, einer Shell-Variablen auf tragbare POSIX-Weise einen Wert zuzuweisen (d. H. TAB = echo "@" | tr "\100" "\011"), und setzen Sie es dann von dort aus überall ein, auf tragbare POSIX-Weise; als auch (d. h. grep "$ TAB" Dateiname). Während diese Lösung gut mit TAB funktioniert, funktioniert sie auch gut mit anderen Binärzeichen, wenn ein anderer gewünschter Binärwert in der Zuweisung verwendet wird (anstelle des Werts für das TAB-Zeichen zu 'tr').

0
odoncaoa

Dies funktioniert gut für AIX. Ich suche nach Zeilen mit JOINED<\t>ACTIVE

voradmin cluster status | grep  JOINED$'\t'ACTIVE

 vorudb201   1       MEMBER(g) JOINED        ACTIVE
*vorucaf01   2       SECONDARY JOINED        ACTIVE
0
gruic

Die 'sed-as-grep'-Methode zu verwenden, aber die Tabs durch einen sichtbaren Buchstaben zu ersetzen, ist meine Lieblingsmethode, da deutlich wird, welche Dateien die angeforderten Informationen enthalten und wo sie in Zeilen platziert sind:

sed -n 's/\t/\*\*\*\*/g' file_name

Wenn Sie die Zeilen-/Dateiinformationen oder andere grep-Optionen verwenden möchten, aber auch den sichtbaren Ersatz für das Tabulatorzeichen sehen möchten, können Sie dies erreichen, indem Sie

grep -[options] -P '\t' file_name | sed 's/\t/\*\*\*\*/g'

Als Beispiel:

$ echo "A\tB\nfoo\tbar" > test
$ grep -inH -P '\t' test | sed 's/\t/\*\*\*\*/g'
test:1:A****B
test:2:foo****bar

BEARBEITEN: Das oben Genannte ist offensichtlich nur zum Anzeigen von Dateiinhalten zum Auffinden von Registerkarten nützlich. Wenn das Ziel darin besteht, Registerkarten als Teil einer größeren Skriptsitzung zu behandeln, hat dies keinen nützlichen Zweck.

0
s8129