Как мне найти адрес в большом файле с помощью grep?

Во время выполнения команды большинство систем позволяют отображать ее среду с помощью команды ps . Это невозможно сделать переносимо, и не все системы позволяют надежный синтаксический анализ, но если все, что вам нужно, - это извлечь «интересные» части исходной среды таким образом, чтобы это работало в конкретном варианте Unix, это просто. Например, в Linux и * BSD:

ps eww $$

В качестве альтернативы в Solaris и Linux:

cat /proc/$$/environ

Или в Solaris и AIX:

pargs -e $$

Если вам нужно скрыть прежнее содержимое среды, убедитесь, что вся оболочка процессы (включая фоновые подоболочки) завершились. Чтобы передавать данные таким образом, чтобы не происходила утечка, используйте канал вместо переменной среды.

exec sh -c 'unset pw; pw=$PASSWORD; unset PASSWORD; printf %s "$pw" | exec theprogram'

Обратите внимание, что в большинстве (всех современных?) Вариантах Unix среда процесса видна только одному и тому же пользователю. Только аргументы обычно видны любому пользователю, выполняющему ps .Так что передавать конфиденциальные данные в среду - это нормально; избавиться от него - это лишь вопрос укрепления, а не элементарной безопасности.

1
06.05.2016, 00:03
2 ответа

Итак, я попытался найти строку, которая начинается с 5 цифр и заканчивается любой буквой , например:

^[0-9][0-9][0-9][0-9][0-9][A-Z]$

Этот шаблон соответствует строкам которые содержат только 5 цифр и (заглавную) букву. Если вы ожидаете, что между ними будет больше, вам нужно будет включить это в шаблон. Если вам все равно, что происходит между ними, используйте . * для поиска любого символа неограниченное количество раз. Вероятно, вам также следует использовать строчные буквы или использовать grep -i , чтобы игнорировать регистр.

^[0-9]\{5\}.*[A-Za-z]$

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

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

^[[:alpha:]]\+[[:space:]]\+[[:alpha:]]\+$

Однако попытка сопоставить имя с регулярным выражением имеет много подводных камней. См. https://stackoverflow.com/questions/2385701/regular-expression-for-first-and-last-name .

0
27.01.2020, 23:35

Вы можете использовать grep -B2 -E '^ [0-9] {5} + [a-zA-Z] + $' , чтобы попытаться найти только блоки адресов.

Некоторые примечания:

  • см. man grep , чтобы получить представление о параметрах
  • см. Конец справочной страницы для grep, чтобы найти справочную страницу, которая подробно объясняет синтаксис регулярных выражений, GNU Сама справочная страница grep также немного объясняет регулярное выражение
  • -B - это «строки перед совпадением» и может быть лучше для вас, чем -C
  • -E для расширенного синтаксиса регулярных выражений
  • указанное мной регулярное выражение соответствует любой строке, состоящей из пяти цифр ( {5} повторяет предыдущее пять раз), затем хотя бы один пробел ( + принимает предыдущее одно или еще раз), а затем только буквы до конца строки.
  • позаботьтесь о том, как вы цитируете свои аргументы в grep. ` очень отличается от ' или " .

Вы можете попытаться найти строки, содержащие только два слова, если попытаетесь найти строки, содержащие только один пробел:

grep -E '^[^ ]+ [^ ]+'

Если вы хотите сопоставить что-то в нескольких строках, я не уверен, что grep может это сделать. Вы можете попробовать сделать это с помощью sed который может загружать следующие строки в пространство шаблонов с помощью N , а затем сопоставлять их с этой конкатенацией (посмотрите man sed , если это вам подходит). (Или perl , я думаю, он может соответствовать многострочным шаблонам, но я не знаю как.)

2
27.01.2020, 23:35

Теги

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