Выберите строки, начинающиеся с 1
и заканчивающиеся пробелом
grep -c '^1\s' file
grep -c '^1[[:space:]]' file
Это также даст количество строк (без необходимости вызова wc)
1
не , за которым следует другое число (или ничего):
grep -cE '^1([^0-9]|$)' file
Но у обоих вышеприведенных решений есть некоторые интересные проблемы, продолжайте читать.
В теле вопроса пользователь утверждает, что файл "разделен табуляцией".
Строка, начинающаяся с 1
, за которой следует табуляция (фактическая табуляция в команде ). Это не удается, если разделителем является пробел (или любой другой, или нет):
grep '^1 ' file
Строка, начинающаяся с 1
, за которой следует пробел (фактический пробел в команде ). Это не удается, если разделитель является любым другим или никаким.:
grep '^1 ' file
grep '^1( | )' file
grep '^1[[:blank:]]' file
Более гибкий вариант — включить несколько пробелов (по горизонтали и по вертикали ). Набор символов [:space:]
состоит из(пробела ),
\t
(горизонтальной табуляции ),\r
(возврата каретки ),\n
(новой строки ),\v
(вертикальной табуляции )и\f
(подача формы ). Но grep не может соответствовать новой строке (, это внутреннее ограничение, которого можно избежать только с помощью опции -z
). Можно использовать как описание на разделителе. Можно и короче,использовать доступное сокращение GNU\s
:
grep -c '^1[[:space:]]` file
grep -c '^1\s' file
Но эта опция не работает, если разделителем является что-то вроде двоеточия :
или любого другого знака препинания (или любой буквы ).
Или, можно использовать переход от цифры к границе "не цифра", ну собственно "символ не в [_[:alnum:]]
(_a-zA-Z0-9
)":
grep -c '^1\b' file # portable but not POSIX.
grep -c '^1\>' file # portable but not POSIX.
grep -wc '^1' file # portable but not POSIX.
grep -c '^1\W' file # portable but not POSIX (not match only a `1`) (not underscore in BSD).
При этом допустимы строки, начинающиеся с 1 и за которыми следует какой-либо знак препинания.
Как насчет того, чтобы попробовать что-то вроде:
if [ $(whoami) = "root" ]