На этот вопрос уже есть ответ здесь:
Я изучаю код на 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
почему? Я прочитал руководство, но не понимаю.
Здесь существует две проблемы. Во-первых, когда Вы работаете 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
В первом случае Вы ищете любой процесс со словом тандерберд в. Существует два тандерберда и сама команда 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
как] предотвращает соответствие.
[] в 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 и Би-би-си.
Во-первых, ли 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
порождение этого появиться в выводе также.