grep вкладка в UNIX

326

Как вкладка grep (\ t) в файлах на платформе Unix?

  • 46
    просто используйте grep "<Ctrl+V><TAB>" , это работает (если в первый раз: введите grep " затем нажмите комбинацию клавиш Ctrl + V, затем нажмите клавишу TAB, затем введите " и нажмите ввод, вуаля!)
  • 12
    Ctrl + V - ДЕЙСТВИТЕЛЬНО ПЛОХАЯ ИДЕЯ! ... да, он может работать из консоли, но он может не работать, чтобы набрать его в сценарии (вы находитесь в зависимости от редактора, например, я использую mcedit и ctrl + v не работают там)
Показать ещё 2 комментария
Теги:
grep

21 ответ

308

Если вы используете GNU grep, вы можете использовать regexp в стиле Perl:

$ grep -P '\t' *
  • 0
    Кажется, это не работает против моей картины. Попытка использовать этот синтаксис ничего не печатает. (Отличается ли вариант Mac OS X?)
  • 2
    @futureelite: Согласно документации Apple ( developer.apple.com/Mac/library/documentation/Darwin/Reference/… ), программа grep для Mac OS X должна поддерживать параметр -P. Попробуйте создать новый вопрос на сайте superuser.com.
Показать ещё 5 комментариев
225

Хитрость заключается в использовании знака $перед кавычками single. Он также работает для вырезания и других инструментов.

$ grep $'\t' sample.txt
  • 7
    Спасательный круг спасает жизни! Насколько я могу судить, он работает и в zsh . Не могли бы вы прокомментировать, что такое семантика этого знака $ ?
Показать ещё 12 комментариев
77

Мне никогда не удавалось использовать метасимвол '\ t' с grep. Однако я нашел два альтернативных решения:

  • Использование <Ctrl-V> <TAB> (нажатие Ctrl-V, набрав вкладку)
  • Использование awk: foo | awk '/\t/'
  • 3
    | awk '/\t/' Решение | awk '/\t/' будет работать для всех оболочек, платформ и систем.
  • 6
    +1 для портативного решения POSIX и не использующего bashisms, zshism, GNUism и linuxisms.
Показать ещё 1 комментарий
34

Из этого ответа на Ask Ubuntu:

Скажите grep использовать регулярные выражения, определенные Perl (Perl имеет \t как вкладка):

grep -P "\t" <file name>

Используйте символ символа в буквах:

grep "^V<tab>" <filename>

Используйте printf для печати символа табуляции для вас:

grep "$(printf '\t')" <filename>
  • 0
    Дословно с http://askubuntu.com/a/53096/453741
  • 0
    Ctrl-V бесполезен, если вы хотите скопировать-вставить (из ваших заметок или скрипта). Лучше использовать явное решение, которое имеет видимые '\ t', буквенные TAB (то есть те, которые выглядят как пробелы) часто преобразуются в SPC при копировании
Показать ещё 1 комментарий
29

Один из способов (это с Bash)

grep -P '\t'

-P включает регулярные выражения в Perl, поэтому \t будет работать.

Как говорит пользователь, он может быть специфичен для GNU grep. Альтернативой является буквально вставить вкладку там, если это разрешит оболочка, редактор или терминал.

  • 0
    Неизвестная опция P в оболочке ksh
  • 0
    Как говорит раскрутка, может быть специфична для GNU grep. Только что уточнил.
Показать ещё 4 комментария
9

Это не совсем то, что вы ищете, но можете работать в вашем случае

grep '[[:blank:]]'

Эквивалентно

grep -P '[ \t]'

Итак, он найдет Space и Tab.

& sect; Классы символов

Заметьте, он не объявлен в моем man grep, но все еще работает

$ man grep | grep blank | wc
      0       0       0
  • 0
    \ т не работает.
  • 0
    @ A-letubby Теперь работает с правкой - был добавлен аргумент -P .
6

Используйте эхо, чтобы вставить вкладку для вас grep "$(echo -e \\t)"

3

В основном есть два способа решить эту проблему:

  • (Рекомендуется) Используйте синтаксис регулярных выражений, поддерживаемый grep (1). Современный grep (1) поддерживает две формы синтаксиса regex POSIX 1003.2: базовые (устаревшие) RE и современные RE. Синтаксис подробно описан в справочных страницах re_format (7) и regex (7), которые являются частью систем BSD и Linux соответственно. GNU grep (1) также поддерживает Perl-совместимые RE, предоставленные библиотекой pcre (3).

    В языке регулярных выражений символ табуляции обычно кодируется атомом \t. Атом поддерживается расширенными регулярными выражениями BSD (egrep, grep -E в BSD-совместимой системе), а также Perl-совместимыми REs (pcregrep, GNU grep -P).

    Оба базовых регулярных выражения и расширенные версии Linux, по-видимому, не поддерживают \t. Пожалуйста, обратитесь к странице служебных программ UNIX, чтобы узнать, какой язык регекса он поддерживает (отсюда и разница между командами sed (1), awk (1) и pcregrep (1)).

    Поэтому в Linux:

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

    В BSD подобная система:

    $ egrep '\t' FILE ...
    $ grep -E '\t' FILE ...
    
  • Передайте символ табуляции в шаблон. Это просто, когда вы редактируете файл script:

    # 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 ...
    

    Обратите внимание, что, хотя в командной строке это хорошо, это может привести к проблемам с совместимостью, когда script будет перемещен на другую платформу. Кроме того, будьте осторожны с кавычками при использовании специальных принадлежностей, пожалуйста, обратитесь к bash (1) для деталей.

    Для оболочки Bourne (и не только) такое же поведение можно эмулировать с помощью подстановки команд, дополненной printf (1), чтобы построить правильное регулярное выражение:

    $ grep "`printf '\t'`" FILE ...
    
3

grep "$(printf '\t')" работал у меня в Mac OS X

2

Хорошим выбором является использование sed как grep (как объяснено в этом классическом sed tutorial).

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
1

+1 способ, который работает в ksh, тире и т.д.: используйте printf для вставки TAB:

grep "$(printf 'BEGIN\tEND')" testfile.txt
  • 0
    Это не сработало для меня в Ubuntu Trusty (Bash 4.3.11), хотя сработало следующее: grep "$(printf '\t')" testfile.txt
0

Обозначение $'\ t', заданное в других ответах, является специфичным для оболочки - оно работает в bash и zsh, но не является универсальным.

ПРИМЕЧАНИЕ. Ниже приведена оболочка fish и не работает в bash:

В оболочке fish можно использовать unquoted \t, например:

grep \t foo.txt

Или можно использовать шестнадцатеричные или уникодовые обозначения, например:

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

(эти обозначения полезны для более эзотерических символов)

Поскольку эти значения должны быть не кавычками, можно комбинировать кавычки и некотируемые значения путем конкатенации:

grep "foo"\t"bar"
0

Эти альтернативные бинарные методы идентификации полностью функциональны. И мне очень нравится тот, который использует awk, поскольку я не мог полностью запомнить синтаксическое использование с одиночными двоичными символами. Однако также должно быть возможно назначить переменную оболочки значение в переносном режиме POSIX (т.е. TAB = echo "@" | tr "\100" "\011"), а затем использовать ее повсюду в переносном режиме POSIX; также (например, grep "$ TAB" filename). Хотя это решение хорошо работает с TAB, оно также хорошо работает с другими двоичными символами, когда в присваивании используется другое желаемое двоичное значение (вместо значения для символа TAB для "tr" ).

0

Возможно, вы захотите использовать grep "$(echo -e '\t')"

Только требование echo должно быть способно интерпретировать обратные слэши.

0

Использование метода "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

EDIT: Очевидно, что вышеизложенное полезно только для просмотра содержимого файла для поиска вкладок --- если целью является обработка вкладок как часть более крупного сеанса сценариев, это не служит никакой полезной цели.

0

Это хорошо работает для AIX. Я ищу строки, содержащие JOINED<\t>ACTIVE

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

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

В ksh я использовал

grep "[^I]" testfile
0

Ответ проще. Напишите свой grep и в типе цитаты введите ключ вкладки, он работает хорошо, по крайней мере, в ksh

grep "  " *
  • 3
    сначала вам нужно суметь ввести символ TAB в вашей оболочке - большинство оболочек интерпретирует этот ключ как команду (завершение)
0

используйте gawk, установите разделитель полей на вкладку (\ t) и проверьте количество полей. Если более 1, то есть /- вкладки

awk -F"\t" 'NF>1' file
  • 0
    что здесь NF?
  • 0
    количество полей. пожалуйста, прочитайте gawk doc, чтобы понять больше.
Показать ещё 1 комментарий
-5

Вы можете ввести

grep \t foo

или
grep '\t' foo

для поиска символа табуляции в файле foo. Возможно, вы также можете использовать другие коды эвакуации, хотя я тестировал только \n. Хотя это довольно трудоемко и непонятно, зачем вам нужно, в zsh вы также можете ввести символ табуляции, вернуться к началу, grep и заключить вкладку с кавычками.

  • 1
    Это не работает
-7

Ищите пробелы много раз [[: space:]] *

grep [[: space:]] * '.' '.'

найдет что-то вроде этого:

'вкладка..

Это одинарные кавычки ('), а не double (").
Так вы делаете конкатенацию в grep. = -)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню