LINUX.ORG.RU

Grep конкретного куска строки

 ,


0

1

Допустим есть строка

Downloads/example/example1.txt - 500 - 2022-07-26 - длинная хеш-сумма - sha256

Нужно для дальнейшей работы выделить как раз ту часть строки, что содержит длинную хеш-сумму. Есть мысль, что надо копать в сторону grep, но с какими аргументами?

В хэш-сумме какие символы могут быть? Если нет пробелов и '-', то можно так:

echo "Downloads/example/example1.txt - 500 - 2022-07-26 - длинная_хеш_сумма - sha256" | sed 's,^.*\-[ ]*\([^ \-]\+\)[ ]*\-[ ]*[^\-]\+$,\1,'
x22
()
Ответ на: комментарий от pihter

Тем, что не воняет смертью, не является языком и имеет маленький быстрокуримый ман. То есть уже тем, что тебе не оторвут жопу потомки или ты сам, когда будешь мучительно вспоминать, что такое $NF, например.

thesis ★★★★★
()
Ответ на: комментарий от thesis

когда будешь мучительно вспоминать, что такое $NF, например

рискую показаться невеждой, ман по кату, по понятным причинам никогда не читал, но можно ли катом взять последний(предпоследний?) аргумент? А если разделитель не из одного символа? ИМХО, кат надо было немного прокачать, бо утилита, явдо делающая что-то одно, делает это несовершенно!

// ЗЫ: не отрывай мне жопу…

pihter ★★★★★
()
Последнее исправление: pihter (всего исправлений: 1)
Ответ на: комментарий от pihter

А если разделитель не из одного символа? ИМХО, кат надо было немного прокачать,

Ога. Засунуть в cut регулярные выражения, например. Не нравится awk - юзай sed. И еще сотни вариантов есть, наверняка.

x22
()
Ответ на: комментарий от Entmatix

Хорошее замечание. Тогда нам нужно грепать пока мы грепаем. *известная_картинка_с_негром*

$ echo 'Downloads/example/example1.txt - 500 - 2022-07-26 - 454e512384c2c941df3286a23e0e48b5143481823749dc4c55b7ff0f6ab6bf7d - sha256' | grep -E -o '[[:alnum:]]{64} - sha256' | grep -E -o '^[[:alnum:]]+'

urxvt ★★★★★
()
Последнее исправление: urxvt (всего исправлений: 1)
Ответ на: комментарий от pihter

можно ли катом взять последний(предпоследний?) аргумент?

Конечно! В этом нам поможет man rev!

На самом деле я не вникал в задачу, просто за долгие годы привык, что awk юзают на уровне сраной print $1 и только. Кстати, за пробелы в имени файла тоже надо отрывать, раз уж ты подразумеваешь их наличие.

thesis ★★★★★
()
Ответ на: комментарий от x22

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

$ ARR=(Downloads/example/example1.txt - 500 - 2022-07-26 - длинная_хеш_сумма - sha256)
$ echo ${ARR[-3]}
длинная_хеш_сумма
Или
$ MYSTR="Downloads/example/example1.txt - 500 - 2022-07-26 - 99156fba3824884cc9daf5ec309e2a7fa456a596358aaa1ae15e4e1919d16b5d - sha256"
$ echo "${MYSTR:${#MYSTR}-73:64}"
99156fba3824884cc9daf5ec309e2a7fa456a596358aaa1ae15e4e1919d16b5d 

thesis ★★★★★
()
Последнее исправление: thesis (всего исправлений: 2)
sed -E 's/.*[0-9]{4}-[01][0-9]-[0-3][0-9] - ([0-9a-f]*) - sha256$/\1/'

Так будет пофиг, что в имени файла, и т.д., если, конечно, формат строк везде одинаковый.

CrX ★★★
()
Ответ на: комментарий от thesis

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

Не можно и без башизмов.

s="Downloads/example/example1.txt - 500 - 2022-07-26 - длинная_хеш_сумма - sha256"
ss=${s% - sha256}
h=${ss##* - }
echo $h
длинная_хеш_сумма

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)