Как перебрать файл в bash, начиная с пользовательской строки? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть файл, для которого я хочу просмотреть только определенную часть использования скрипта bash. Вот пример его формата:

FILE 1

(exclude)
. 

(Start loop from here)
.
.
.
(stop)

Как мне перебрать файл, начиная с нужной мне строки, и остановиться там, где это необходимо? Я полагаю, мне понадобится цикл для этой ситуации? Я знаю шаблон для первой строки, если требуется grep. Или номер строки, который, вероятно, является постоянным для всех моих файлов (скажем, начинается с 5, заканчивается на 9)

Ответы [ 3 ]

1 голос
/ 26 июня 2019

Поскольку вы сказали, что у вас есть номера строк, вы можете использовать tail.Например, чтобы перебрать файл, начинающийся со строки 42, вы можете сделать

tail -n +42 YOUR_FILE | while line
do
    process_line "$line"
done
1 голос
/ 26 июня 2019

Настройка конечного автомата с использованием AWK, который включает обработку строк, когда обнаружен начальный шаблон, и либо

  1. отключает обработку, когда обнаружен шаблон останова (это позволяет обрабатывать более одногогруппа старт / стоп

или

выходит из сценария, когда найден шаблон остановки (это прекращает всю обработку и ускоряет процесс, когда вам ничего не нужно после шаблона остановки)
awk '/stop/  {process = 0}
     process {print $1, $5}
     /start/ {process = 1}' inputfile

Это можно поставитьв одной строке, но здесь я разбил его на части для облегчения чтения.

process используется в качестве логической переменной.Если это правда, выведите пару полей из текущей строки.

/start/ и /stop/ представляют регулярные выражения для сопоставления строк, которые вы будете использовать для разделения разделов файла, который вы хотитепроцесс.Вместо этого вы можете использовать номера строк, например, вы можете изменить тест /start/ на NR == 120, чтобы начать обработку на 120-й строке.

Если вы хотите, чтобы начальная и конечная строки были включены в обработку,просто переместите строку process после строки /start/ и строку /stop/, чтобы быть последними (по существу, в обратном порядке).

Как я уже показал, этот сценарий будет обрабатывать многократный запуск/ остановить блоки в файле.Если вы хотите обработать только первую (или единственную), вы можете изменить строку /stop/ на:

/stop/  {exit)
0 голосов
/ 26 июня 2019

Пример: извлечь имя пользователя и домашний каталог из /etc/passwd, начиная с mail и заканчивая nobody.

cat /etc/passwd |
sed -n '/^mail/,/^nobody/p' |
while IFS=: read user pw uid gid geco home sh line; do
  echo "$user: $home"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...