Что ж, судя по тому, что вы показываете, мне удалось разделить их довольно надежно, но с этими данными есть серьезная проблема: они ненормально . У вас здесь дружественные к человеку ценности - это нехорошо. Например, различия MB
и GB
между первой и последней строками - обработка, которая представляет собой много дополнительной работы, которую вам не нужно делать - почему бы и нет только байт считается? А что там с ([h]: [mm])
- почему оно в первой строке, а не в последней и почему не в Unix-времени?
Честно говоря, это не то данные, которые вы вообще должны регистрировать - это не очень полезно. Конечно, вам легче читать, но собираетесь ли вы прочитать 10 000 строк? Я думаю, вы бы этого не сделали, и поэтому вы задали этот вопрос. Вам нужно изменить этот вывод - не получать вообще никаких букв, только количество байтов и секунды с начала эпохи. Сделайте это, и вам будет много легче.
Итак, с учетом сказанного, вот что я сделал сделал:
set -- $(
sed '$bl;1H;d;:l;x;G
s/([1-9][^)]*) //;h
s/\n/First:& /
s/[^:]\(\n\)/&Last:\1 /
w /dev/fd/2
g' <<\DATA
1931255808 B 1.8 GB 3683.6 s (1:01 h) 524289 B/s 512.00 KB/s
2560401408 B 2.4 GB 4883.6 s (1:21 h) 524289 B/s 512.00 KB/s
3189547008 B 3.0 GB 6083.6 s (1:41 h) 524289 B/s 512.00 KB/s
3818692608 B 3.6 GB 7283.6 s (2:01 h) 524289 B/s 512.00 KB/s
4447838208 B 4.1 GB 8483.6 s (2:21 h) 524289 B/s 512.00 KB/s
10829824 B 10.3 MB 20.65 s 524487 B/s 512.19 KB/s
DATA
)
Эта первая sed
строка - это все, что нужно, чтобы получить только вашу первую и последнюю строки и поместить их в то же пространство шаблонов для редактирования sed
, каждому из которых предшествует символ \ n
ewline. Этот оператор делает все это:
$bl;1H;d;:l;x;G
Следующая строка очищает данные, которые являются частью проблемы, а затем сохраняет дополнительную копию результатов в h
старом пространстве:
s/([1-9][^)]*) //;h
] В следующих трех строках перед соответствующими строками вставляются слова Первый: и Последний: затем \ n
ewline и
. и запишите результаты в stderr
:
s/\n/First:& /
s/[^:]\(\n\)/&Last:\1 /
w /dev/fd/2
Последняя sed
строка просто g
и эта вторая копия из h
старого пространства и перезаписывает текущее пространство шаблонов им, которое sed
затем выполняет действие по умолчанию - печать последнего пространства шаблонов, за которым следует \ n
ewline. По общему признанию, результаты на данный момент не такие впечатляющие. Выполнение приведенного выше фрагмента сценария приведет только к следующему:
First:
1931255808 B 1.8 GB 3683.6 s 524289 B/s 512.00 KB/s
Last:
10829824 B 10.3 MB 20.65 s 524487 B/s 512.19 KB/s
Но я намеренно установил
результаты в массив оболочки , а сохранил обе строки доступными в sed
Пространство шаблонов неспроста. Например, следуя последней строке g
в sed
- при желании - вы можете работать с пространством шаблонов, которое выглядит следующим образом:
\n1931255808 B 1.8 GB 3683.6 s 524289 B/s 512.00 KB/s\n10829824 B 10.3 MB 20.65 s 524487 B/s 512.19 KB/s$
Или, если вы оставили его как есть и только добавил следующее к тому, что уже есть ...
printf '%s LINE, FIELDs 1 and 2: %s and %s' \
FIRST "$1" "$2" LAST "${11}" "${12}"
Ваш вывод должен выглядеть так:
FIRST LINE, FIELDs 1 and 2: 1931255808 and B
LAST LINE, FIELDs 1 and 2: 10829824 and B
Это в дополнение к уже предоставленному stderr
выводу.