grep -E '^([^,]*,){5}Happy' <in >out
Это позволит найти Happy
только если он находится непосредственно рядом с 5-й запятой. Если вы хотите найти его в любом месте 6-го поля, то добавьте немного передышки:
grep -E '^([^,]*,){5}[^,]*Happy' <in >out
Если вам нужен просто подсчет совпавших строк, используйте опцию -c
:
grep -cE '^([^,]*,){5}[^,]*Happy' <in >out
Я хорошо знаком с регулярными выражениями, но даже если бы не был знаком, думаю, я бы все равно выбрал синтаксис re, а не другие виды. Как только вы освоите некоторые основы, все остальное становится понятно. Регулярные выражения описывают входные данные, комбинируя несколько основных строительных блоков любым количеством способов.
*
Kleene Star
[
выражение в скобках ]
^
отрицаемого) набора содержащихся символов{
min ,
max }
повторение
задает счетчик вхождений для непосредственно предыдущего выражения
расширенный regexp ?
метасимвол - это просто сокращение для {0,1}
.
(
подвыражение )
.
символ
^|$
^
начало строки для следующего выражения, либо |
чередование между выражениями, либо $
конец строкиЭто основы. Синтаксис расширенных регулярных выражений POSIX -E
также включает Kleene +
- который идентичен *
во всех отношениях, за исключением того, что он требует по крайней мере одного совпадения для предыдущего выражения. Существуют также всевозможные тонкости, связанные с [
скобочными выражениями ]
- особенно с внутренними [(:|.|=)
классами символов (=|.|:)]
и тем, как они соответствуют повторениям. И большинство реализаций фактически расширяют расширенный синтаксис re, по крайней мере, для обработки базовых regexp \[num]
обратных ссылок на более раннее (
подвыражение )
.
Но, учитывая только основы, любое из приведенных выше выражений или любой другой отдельный символ является выражением сам по себе, и все они объединяются в общее выражение для описания желаемого соответствия.
Сложите все это вместе, и выражение grep
, приведенное выше, будет выглядеть так:
^([^,]*,){5}Happy
Happy
. Нужно использовать --iconv
.
Из справочной страницыhttps://linux.die.net/man/1/rsync
--iconv=CONVERT_SPEC
Rsync can convert filenames between character sets using this option.
Using a CONVERT_SPEC of lq.rq tells rsync to
look up the default character-set via the locale setting. Alternately,
you can fully specify what conversion to do by giving a local and a
remote charset separated by a comma in the order --iconv=LOCAL,REMOTE,
e.g. --iconv=utf8,iso88591. This order ensures that the option will
stay the same whether you're pushing or pulling files. Finally, you
can specify either --no-iconv or a CONVERT_SPEC of lq-rq to turn off
any conversion. The default setting of this option is site-specific,
and can also be affected via the RSYNC_ICONV environment variable.