Как найти строки, содержащие более 100 символов, и содержит «if»?

Поэтому, вероятно, я должен использовать grep для этого. Пока мне нужен рекурсивный поиск, я должен использовать grep -r . Но тогда я не знаю, что мне делать дальше;)

Как я могу это сделать?

Вы можете использовать два greps, соединенных трубой:

 grep -r '.\{100\}' /path | grep 'if' 

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

С grep s, которые поддерживают параметры -r (рекурсивный) и -P (PCRE) (или pcregrep с -r ):

 grep -rP '^(?=.{101}).*?if' . 

Или POSIXly:

 find . -type f -exec awk 'length > 100 && /if/ { print FILENAME ": " $0}' {} + 

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

Использовать awk для подсчета размера $ 0 и наличия подстроки, если?
awk '( length($0) > 100 && index($0,"if") ){print}' file

Если «if» должно быть словом (в отличие от простой подстроки), вы можете использовать awk '( length($0) > 100 && match($0,/\<if\>/) ){print}' file

Адаптировано из « Найти любые строки, превышающие определенную длину», любое из следующих действий будет работать, чтобы найти строки длиной более 100 символов

 grep '.\{100\}' file perl -nle 'print if length$_>99' file awk 'length($0)>99' file sed -n '/.\{100\}/p' file 

выберите свой предпочтительный метод и пропустите его через grep if

с одним grep :

 grep -vxE '.{0,99}|([^i]|i[^f])*i*' <in >out 

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

 printf '^%-100b$\n' 'if\nif' 'hey if' i if | grep -nvxE '.{0,99}|([^i]|i[^f])*i*' 

 3:^hey if $ 5:^if $ 

вы могли бы лучше всего использовать два grep s.