Рассмотрим следующее:
var="text more text and yet more text"
echo $var | egrep "yet more (text)"
Должно быть возможно получить результат регулярного выражения в виде строки: text
Однако я не вижу способа сделать это в bash с помощью grep или его братьев и сестер.
В perl, php или аналогичных регулярных выражениях:
$output = preg_match('/yet more (text)/', 'text more text yet more text');
$output[1] == "text";
Редактировать: Чтобы объяснить, почему я не могу просто использовать многократное регулярное выражение, в конце у меня будет регулярное выражение с несколькими из них (как показано ниже), поэтому я должен иметь возможность получить все из них. Это также исключает возможность использования lookahead / lookbehind (поскольку все они имеют переменную длину)
egrep -i "([0-9]+) +$USER +([0-9]+).+?(/tmp/Flash[0-9a-z]+) "
Пример ввода по запросу, прямо из lsof (замените $ USER на «j» для этих входных данных):
npviewer. 17875 j 11u REG 8,8 59737848 524264 /tmp/FlashXXu8pvMg (deleted)
npviewer. 17875 j 17u REG 8,8 16037387 524273 /tmp/FlashXXIBH29F (deleted)
Конечная цель - cp /proc/$var1/fd/$var2 ~/$var3
для каждой строки, что приводит к «загрузке» флеш-файлов (флеш-память использовалась для хранения в / tmp, но они ее помещали)
Пока у меня есть:
#!/bin/bash
regex="([0-9]+) +j +([0-9]+).+?/tmp/(Flash[0-9a-zA-Z]+)"
echo "npviewer. 17875 j 11u REG 8,8 59737848 524264 /tmp/FlashXXYOvS8S (deleted)" |
sed -r -n -e " s%^.*?$regex.*?\$%\1 \2 \3%p " |
while read -a array
do
echo /proc/${array[0]}/fd/${array[1]} ~/${array[2]}
done
Он обрезает первые цифры первого возвращаемого значения, и я недостаточно знаком с sed, чтобы понять, что не так.
Конечный результат для загрузки флэш-видео 10,2+ (включая, возможно, зашифрованные):
#!/bin/bash
lsof | grep "/tmp/Flash" | sed -r -n -e " s%^.+? ([0-9]+) +$USER +([0-9]+).+?/tmp/(Flash[0-9a-zA-Z]+).*?\$%\1 \2 \3%p " |
while read -a array
do
cp /proc/${array[0]}/fd/${array[1]} ~/${array[2]}
done