Найти слово, которое содержит более 50 символов

Я пытаюсь использовать find в сочетании с grep, чтобы найти все файлы php на моем веб-сервере, в которых есть слово (любая последовательность символов, кроме пробела), содержащее более 50 символов.

У меня есть эта база:

find . -name '*.php' -exec fgrep -q '.{50}' {} \; -print

Но не работает, как ожидалось.

Благодаря

1
задан 15.05.2020, 05:44

2 ответа

Лично я использую egrep только:

egrep -nor '[^ ]{50,}' .

Видят man egrep для понимания то, что происходит в предыдущей команде.

0
ответ дан 15.05.2020, 05:44
  • 1
    Да, но это неэффективно, так как это будет сначала иметь к grep все файлы. OP' s находка использования подхода лучше. Кроме того, в то время как поиск несимволов пробела является хорошей идеей, [^ ] только ищет непробелы и будет соответствовать \t и \r и \n. Наконец, я рекомендую grep -E вместо устаревшего (см. man grep) egrep, который постепенно сокращается. – Pablo 15.05.2020, 05:44
  • 2
    Спасибо за это. Мое беспокойство - то, что Ваша команда повторит результаты. Я хочу к эху actully имя файла, когда я вставил свой исходный вопрос... Можно ли помочь мне сделать это? – arilwan 15.05.2020, 05:45
  • 3
    @HommerSmith протестируйте команду: это распечатает имя файла, сопровождаемое с методической точностью число и сопровождаемый словом. Если Вы хотите только имена файлов, можно использовать: egrep -or '[^ ]{50,}' . | cut -d: -f1 – Álvaro Arranz 15.05.2020, 05:45

Это не работает как ожидалось, потому что -q средства quiet, это заставляет grep не печатать что-либо, это только полезно при тестировании существовать состояния grep. То, что Вы хотите, ближе к:

find . -name '*.php' -exec grep -lP '\w{50,}' {} \;

Эти -l означает, "печатают название файла соответствия", и -P активирует жемчуг совместимые регулярные выражения, таким образом, мы можем использовать \w, который является стенографией для символов соответствующего слова (в основном [a-zA-Z0-9-_], но детали зависят от Вашей локали. Используя [1 110] хорошая идея, но рассчитает \t и \r и даже \n, а также более странные вещи как [1 114] как слова, и я предполагаю, что это не то, что Вы хотите.

, Если Вы хотите соответствовать какой-либо непробел, используйте это вместо этого:

find . -name '*.php' -exec grep -lP '\S{50,}' {} \;
0
ответ дан 15.05.2020, 05:45

Теги

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