Это может быть ваша команда. Это скрипт, который берет имя файла в командной строке и выводит в нем все строки, содержащие ровно семь символов :
.#!/bin/sh
grep -c '^.......$' "$1"
Вы должны сделать приведенный выше скрипт исполняемым (с чем-то вроде chmod +x script.sh
), а затем запустить его с ./script.sh file
, где file
— это имя файла, который вы хотите изучить.
Команда
grep -c '^.......$'
выведет количество строк в заданном файле, содержащих ровно семь символов (, включая пробелы ).
Можно сократить до
grep -cEx '.{7}'
-E
не требуется, поскольку выражение теперь является расширенным регулярным выражением .Флаг -x
заставит выражение соответствовать полной строке.
Если вы не хотите считать пробелы и вас интересуют только «словные символы» (буквенно-цифровые символы ), вы можете использовать
grep -cExw '.{7}'
Флаг -w
для grep
заставит совпадение быть "словом" (строкой буквенно-цифровых символов, разделенных не -буквенно-цифровыми символами ).
Если вы хотите подсчитать, сколько существует уникальных строк, которые соответствуют этому критерию (вот как я интерпретирую «разные строки» ), затем передайте результат grep
без -c
флаг через uniq
и wc -l
. Это подсчитает количество уникальных строк, содержащих ровно семь символов слова.
grep -Exw '.{7}' | uniq | wc -l
В сценарии это становится
grep -Exw '.{7}' "$1" | uniq | wc -l
Вы можете использовать для этого awk
, которая имеет специальную переменную NR
, которая отслеживает номер текущей записи с начала файла. Переменная увеличивается в конце каждой строки. При печати в блоке END
, т.е. после обработки всех входных строк, печатается номер последней обработанной записи.
printf "aa\nbb" | awk 'END { print NR }'
2
printf "aa\nbb\n" | awk 'END { print NR }'
2
С GNU sed
вы можете использовать:
sed '$=;d'
Поскольку GNU sed
считает эти дополнительные символы после последней новой строки дополнительной строкой. GNU sed
, как и большинство утилит GNU, также поддерживает символы NUL в своем вводе и не имеет ограничения на длину строк (два других критерия, которые делают ввод не -текстом согласно POSIX ).
POSIXly, построение -на основе ответа @Inian для поддержки слишком -длинных строк и нулевых байтов:
LC_ALL=C tr -cs '\n' '[x*]' | awk 'END {print NR}'
Эта команда tr
переводит все последовательности из одного или нескольких символов, (каждый байт интерпретируется как символ в локали C, чтобы избежать проблем с декодированием, )кроме новой строки, в одинx
символ, поэтому Входные записи awk
будут иметь длину 0 или 1 байт, а его входные данные будут содержать только x
и символы новой строки.
$ printf '%10000s\na\0b\nc\nd' | wc -l
3
$ printf '%10000s\na\0b\nc\nd' | mawk 'END{print NR}'
2
$ printf '%10000s\na\0b\nc\nd' | busybox awk 'END{print NR}'
5
$ printf '%10000s\na\0b\nc\nd' | gawk 'END{print NR}'
4
$ printf '%10000s\na\0b\nc\nd' | LC_ALL=C tr -cs '\n' '[x*]' | mawk 'END{print NR}'
4