Как может я grep для этого или что (2 вещи) в файле?

Существует несколько способов сказать без полномочий пользователя root, многих из них tricky/hacky:

Используя /dev/disk/by-id:

find /dev/disk/by-id/ -lname '*sdX'

Если это отвечает чем-то как /dev/disk/by-id/usb-blah-blah-blah, затем это - диск USB. Другие префиксы включают ata, dm, memstick, scsi, и т.д.

Используя /dev/disk/by-path не существенно отличается:

find /dev/disk/by-path/ -lname '*sdX'

Вы получите что-то как /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0. Это показывает продвижение пути устройства диску. В этом случае грубым путем является PCI → USB → диск. (отметьте -usb-).

Используя udev (я выполняю Debian. Мой udevadm находится в /sbin который не находится на моем $PATH — Ваш мог бы быть в другом месте, на или от Вашего $PATH):

/sbin/udevadm info --query=all --name=sdX | grep ID_BUS

Вы получите тип шины, устройство работает. Удалите | grep ID_BUS для полного списка информации (Вы, возможно, должны добавить |less).

Если Вы имеете lshw установленный, ответ Huygens' может также работать:

lshw -class disk -class storage | less

И просмотрите вывод для своего диска. В less, попробуйте / sdX и посмотрите на предыдущее, bus info строки — первая просто скажет scsi@…, но несколько строк, прежде чем это будет более поучительно. Однако действительно необходимо выполнить это как суперпользователь, таким образом, это не может подойти. (признаки: на ноутбуке я попробовал его, это перечислило диск SATA, но не USB один — работающий с sudo перечисленный оба)

Существуют другие также, более или менее прямые, чем эти.

39
14.07.2013, 19:01
3 ответа

Необходимо поместить выражение в кавычки. Ошибка, которую Вы получаете, является результатом удара, интерпретирующего ( как специальный символ.

Кроме того, необходимо сказать grep использовать расширенные регулярные выражения.

$ grep -E '(then|there)' x.x

Без расширенных регулярных выражений необходимо выйти |, (, и ). Обратите внимание, что мы используем одинарные кавычки здесь. Bash рассматривает обратные косые черты в двойных кавычках особенно.

$ grep '\(then\|there\)' x.x

Группировка не необходима в этом случае.

$ grep 'then\|there' x.x

Это было бы необходимо для чего-то вроде этого:

$ grep 'the\(n\|re\)' x.x
55
27.01.2020, 19:35
  • 1
    См. также grep $'then\nthere' и grep -e then -e there. Отметьте это \| не является стандартным в BREs. Остальное. Bash рассматривает обратные косые черты особенно в двойных кавычках только прежде ", $, \ , ` и новая строка. –  Stéphane Chazelas 14.07.2013, 19:46

Просто быстрое приложение, большинство ароматов имеет команду, названную egrep, который является просто grep с-E. Я лично как намного лучше для ввода

egrep "i(Pod|Pad|Phone)" access.log

Чем использовать grep-E

7
27.01.2020, 19:35

Материал, зарегистрированный под РЕГУЛЯРНЫМИ ВЫРАЖЕНИЯМИ в (или по крайней мере, мой) страница справочника, на самом деле для расширенного regexps;

grep понимает три различных версии синтаксиса регулярного выражения: “основной”, “расширенный” и “жемчуг”. В GNU grep, нет никакого различия в доступной функциональности между основными и расширенными синтаксисами. В других реализациях основные регулярные выражения менее мощны. Следующее описание относится к расширенным регулярным выражениям; различия для основных регулярных выражений получены в итоге впоследствии.

Но grep не использует их по умолчанию - Вам нужно -E переключатель:

grep "(then|there)" x.x

Поскольку (из страницы справочника снова):

Основной по сравнению с расширенными регулярными выражениями

В основных регулярных выражениях метасимволы?, +, {|, (и) теряют их особое значение; вместо этого используйте backslashed версии \?, +, {\|, (и).

Таким образом, можно также использовать:

grep "then\|there" x.x

Так как круглые скобки являются лишними в этом случае.

2
27.01.2020, 19:35

Теги

Похожие вопросы