команда grep и [ ] [duplicate]

На этот вопрос уже есть ответ здесь:

Я изучаю код на bash, а сегодня изучаю команду grep .

, если я запустил

$ ps -fU user | Терминал grep thunderbird

показывает:

user  17410     1  0 10:09 ?        00:00:20 /usr/lib/thunderbird/thunderbird
user  18990 15896  0 12:25 pts/1    00:00:00 grep --color=auto thunderbird

Но если я запускаю:

$ ps -fU user | grep [t]hunderbird

, терминал показывает:

user  17410     1  0 10:09 ?        00:00:20 /usr/lib/thunderbird/thunderbird

почему? Я прочитал руководство, но не понимаю.

10
задан 7 November 2015 в 05:54

4 ответа

Здесь существует две проблемы. Во-первых, когда Вы работаете ps | grep ..., grep процесс также показывают в выводе ps. Значение по умолчанию ps вывод включает аргументы, процесс был запущен с, не только имя процесса. Это означает это, если Вы работаете grep foo, и существует рабочий названный процесс foo, будет два ps соответствие результатов foo: foo процесс и grep самостоятельно, так как это ищет foo. Поэтому Вы получаете две строки при выполнении ps -f | grep thunderbird.

Теперь, [ ] конструкция регулярного выражения, которая определяет список символов, класса символов. Например, [abc] будет соответствовать a или b или c. Когда Вы работаете ps -f | grep [t]hunderbird, тот класс только содержит отдельный символ, так эквивалентно thunderbird без скобок. Однако grep процесс был запущен с [t]hunderbird как аргумент на этот раз, и нет thunderbird. Поэтому его строка в выводе ps будет содержать [t]hunderbird. Это будет похоже на это:

terdon   23101 10991  0 16:53 pts/3    00:00:00 grep --color [t]hunderbird

Это означает, что не подобрано, когда Вы работаете ps -f | grep thunderbird так как это содержит [t]hunderbird и нет thunderbird.

Это - общий прием, чтобы не соответствовать grep сам процесс при выполнении ps | grep. Другая альтернатива должна работать ps -f | grep foo | grep -v grep исключить grep. Лучший подход, однако, должен использовать программу, специально предназначенную для этого, pgrep:

$ pgrep -l thunderbird
11330 thunderbird
14
ответ дан 23 November 2019 в 04:20

В первом случае Вы ищете любой процесс со словом тандерберд в. Существует два тандерберда и сама команда grep.

Во втором Вы также ищете t символ, сопровождаемый hunderbird, как [t] средства соответствуют любым перечисленным символам в квадратной скобке, которой существует только тот, буква T, но на этот раз Ваши два процесса

user  17410     1  0 10:09 ?        00:00:20 /usr/lib/thunderbird/thunderbird
user  18990 15896  0 12:25 pts/1    00:00:00 grep --color=auto [t]hunderbird

, второй процесс не соответствует, потому что rexep [t] hunderbird не соответствует , литеральная строка [t]hunderbird как] предотвращает соответствие.

6
ответ дан 23 November 2019 в 04:20

[] в grep используется для символьного соответствия. Если мы берем grep [tb]all my_file.txt

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

grep tall my_file.txt
grep ball my_file.txt

, Это выполнится grep со взятием t+all, и затем это выполнится grep путем взятия b+all.

, Например: Если мы хотим искать слово ABC или Би-би-си в файле, мы можем использовать следующую команду grep:

grep [AB]BC file_name 

Здесь [] сделает grep для расширения слова путем взятия A, затем оно развернет слово при помощи B, таким образом создавая ABC и Би-би-си.

1
ответ дан 23 November 2019 в 04:20

Во-первых, ли grep --color=auto thunderbird появится на таблице процессов и следовательно на выводе ps зависит от времени т.е. насколько занятый Ваша система и для какого количества времени требуется ps для показа чего-то на, он произвел (путем парсинга таблицы процессов), который запустился одновременно, grep в этом случае. Хотя это - очень маловероятный случай, и мы можем принять это это grep появится на выводе ps.

Теперь, [] grep синтаксис, что означает (если не сопровождаемый другими маркерами), соответствуют любому из символов внутри []. Таким образом, когда Вы используете grep '[t]hunderbird', grep обработки [t] соответствовать только t, в результате это не появилось бы в выводе.

При использовании grep thunderbird, если бы это делает это путем в таблице процессов, мы нашли бы grep процесс в выводе, как мы grep- ping для того же самого т.е. grep thunderbird.

Также отметьте это grep псевдоним к grep --color=auto порождение этого появиться в выводе также.

3
ответ дан 23 November 2019 в 04:20

Другие вопросы по тегам:

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