2013-09-05 4 views
5

Я довольно новичок в командах grep и sed. Как можно удалить +50.0 из Core 0: +50.0°C (high = +80.0°C, crit = +90.0°C), используя grep или sed в скрипте bash?Извлечение с использованием sed или grep

acpitz-virtual-0 
Adapter: Virtual device 
temp1:  +50.0°C (crit = +89.0°C) 
temp2:  +50.0°C (crit = +89.0°C) 

coretemp-isa-0000 
Adapter: ISA adapter 
Core 0:  +50.0°C (high = +80.0°C, crit = +90.0°C) 
Core 2:  +47.0°C (high = +80.0°C, crit = +90.0°C) 

Bash сценария:

#!/bin/bash 

temp=`sed -n '/^Core 0:  $/,/^(high/p' ~/Desktop/sensors.txt` 

echo $temp 
+0

У вас есть более конкретные правила о том, что нужно извлечь? Это всегда сразу после «Core 0:», но до '('? –

+0

Я просто хочу извлечь все, что присутствует между Core 0: и (если возможно устранить дополнительное пространство между Core 0: и +50.0 (которое динамический) –

ответ

2

Использование grep -oP (PCRE регулярное выражение):

grep -oP 'Core 0: +\K[+-]\d+\.\d+' ~/Desktop/sensors.txt 
+50.0 
+0

Спасибо .. Его работа. –

+0

Добро пожаловать, рад, что это сработало для вас. – anubhava

2
grep -e '^Core 0:' [input] | awk '{ print $3 }' 

Или поочередно, только в AWK,

awk '{ r = "^Core 0:" } { if(match($0,r)) { print $3 } }' [input] 

Оба они напечатают поле, которое, как вам кажется, ищут, при этом устраняются окружающие пробелы.

+0

'grep -e '^ Core 0:' [input] | awk '{print $ 3}'' print' device (крит-адаптер + 50.0 ° C + 47.0 ° C. Мне просто нужно +50.0 –

+0

Похоже, что grep не работает по какой-то причине, а awk-код просто работает по всем строкам. однако, - оба работают нормально на моей машине. – qaphla

+0

[Не используйте 'grep | awk' в любом случае.] (http://partmaps.org/era/unix/award.html#grep) Просто' awk '/^ Core 0:/{print $ 3} 'input' делает это намного элегантнее, лаконично и идиоматично. – tripleee

2

Использование Grep переходящий в флаге жемчужно-регулярное выражение и использовать \K отбросить ненужные части линии к левым

grep -oP '^Core 0:\s+\K\+\d+[.]\d+?' 
+0

Спасибо .. Его работа. –

1

Для полноты, вот попытка фиксации вашего sed сценария.

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

(. Так, перефразировать, sed -n '/first/,/last/p' file будет печатать с первой строки в file соответствие first, и останавливается, когда он находит last на последующей строке ввода из файла)

Попробуйте вместо этого:

sed -n 's/^Core 0: *//;T;s/ (high.*//p' ~/Desktop/sensors.txt 

Это заменит первое выражение ничем. Если замена не произошла, T переходит к концу сценария (неявно ничего не делая, просто начиная со следующей строки ввода). В противном случае у нас есть совпадение, поэтому мы также заменяем хвост ничем и печатаем.

... Однако не все sed диалекты имеют команду T, а некоторые, по-видимому, не любят скрипты, разделенные точкой с запятой.

Смежные вопросы