$ grep -c '\.java$' file
3
Флаг -c
для grep
заставит его сообщить количество строк во входных данных, соответствующих шаблону.
Шаблон \.java$
будет соответствовать любой строке, заканчивающейся на .java
.
$ name="file"
$ printf 'Total number of Java files in "%s":\t%d\n' "$name" "$( grep -c -- '\.java$' "$name" )"
Total number of Java files in "file": 3
Или даже просто (с GNU grep
или совместимым):
$ grep -Hc '\.java$' file
file:3
Или (по-прежнему с GNU grep
):
$ grep --label='Total java files in "file"' -Hc '\.java$' < file
Total java files in "file":3
Использование awk
:
$ awk -v num="$num" 'NR == num { print $NF }' data.in
Проверка:
$ num=3
$ awk -v num="$num" 'NR == num { print $NF }' data.in
two
Сценарий awk
читает входной файл запись за записью (по умолчанию запись - это строка). Как только он находит запись, соответствующую переменной num
, он печатает последнее поле этой записи (по умолчанию поле - это столбец, разделенный пробелами).
Переменная num
внутри сценария awk
- это переменная awk
, которую мы инициализируем значением переменной оболочки num
с помощью -v num="$num"
в командной строке.
NR
- это номер текущей записи, а NF
- количество полей в этой записи. $NF
- это данные последнего поля.
Если ваш файл строго разделен запятыми, добавьте -F ','
в командную строку:
$ awk -v num="$num" -F ',' 'NR == num { print $NF }' data.in
С помощью grep
вы не можете выбрать конкретную строку, но вместе с sed
вы можете отфильтровать нужную вам строку и получить последний бит после последней запятой:
$ sed -n "${num}p" data.in | grep -o '[^,]*$'
Бит sed
получит указанную строку, а бит grep
извлечет все после последней запятой в этой строке.
Это можно сделать и с помощью sed
:
$ sed -n "${num}s/^.*,\(.*\)$/\1/p" data.in
Здесь подстановка применяется только к строке, номер которой $num
, заменяет всю строку содержимым строки после последней запятой и выводит результат. Весь остальной вывод блокируется с помощью переключателя командной строки -n
.
В качестве альтернативы используйте подстановку в sed
, чтобы просто удалить все содержимое строки до последней запятой:
$ sed -n "${num}s/^.*,//p" data.in
В awk NR - номер строки, NF - количество столбцов, поэтому $NF - последний столбец. FS - разделитель входных записей, ', '
для CSV без кавычек запятых должно быть достаточно.
awk -v FS=', ' 'NR==3{print $NF}'