2013-09-05 37 views
5

Tôi khá mới đối với lệnh grep và sed.How có thể +50.0 được trích xuất từ ​​Core 0: +50.0°C (high = +80.0°C, crit = +90.0°C) sử dụng grep hoặc sed trong tập lệnh bash?Trích xuất bằng sed hoặc 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 Script:

#!/bin/bash 

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

echo $temp 
+0

Bạn có quy tắc cụ thể hơn về những gì cần được trích xuất không? Nó luôn luôn là ngay sau khi 'Core 0:' nhưng trước khi '('? –

+0

Tôi chỉ muốn trích xuất bất cứ điều gì hiện tại ở giữa Core 0: và (Nếu có thể loại bỏ không gian thêm giữa Core 0: và +50.0 (đó là năng động) –

Trả lời

2

Sử dụng grep -oP (PCRE regex):

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

Cảm ơn .. Hoạt động của nó –

+0

Bạn được chào đón, vui mừng vì nó đã hoạt động cho bạn. – anubhava

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

Hoặc luân phiên, chỉ trong awk,

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

Cả hai thứ này sẽ in ra trường mà bạn dường như đang tìm kiếm, với khoảng trắng xung quanh bị loại bỏ.

+0

'grep -e '^ Core 0:' [input] | awk '{print $ 3}'' đang in 'thiết bị (crit (crit adapter + 50.0 ° C + 47.0 ° C'. Tôi chỉ cần +50.0 –

+0

Có vẻ như grep không hoạt động vì một lý do nào đó, và mã awk chỉ chạy trên tất cả các dòng. đang xảy ra, mặc dù - cả hai đều chạy tốt trên máy của tôi – qaphla

+0

[Không sử dụng 'grep | awk' anyway.] (http://partmaps.org/era/unix/award.html#grep) Đơn giản chỉ cần 'awk'/^ Core 0:/{print $ 3} 'input' thực hiện điều đó một cách tao nhã hơn, ngắn gọn, và thành ngữ hơn – tripleee

2

Sử dụng grep đi qua trong cờ perl-regex và sử dụng \K để loại bỏ các phần un cần thiết của dòng sang trái

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

Cảm ơn .. Nó hoạt động. –

1

Đối với đầy đủ lợi ích, đây là một nỗ lực sửa chữa sed kịch bản của bạn.

sed là dòng được định hướng, do đó, nỗ lực của bạn sẽ in từ bất kỳ thứ gì khớp với biểu thức đầu tiên (sẽ không bao giờ khớp) với dòng sau khớp với dòng thứ hai.

(. Vì vậy, để nói lại, sed -n '/first/,/last/p' file sẽ in từ dòng đầu tiên trong file phù hợp với first, và dừng lại khi nó tìm thấy last trên một dòng đầu vào tiếp theo từ các tập tin)

Hãy thử điều này thay vì:

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

Điều này sẽ thay thế biểu thức đầu tiên mà không có gì. Nếu sự thay thế không xảy ra, T sẽ nhảy tới cuối tập lệnh (hoàn toàn không làm gì cả, chỉ cần bắt đầu lại với dòng nhập tiếp theo). Nếu không, chúng tôi có một trận đấu, vì vậy chúng tôi cũng thay thế đuôi không có gì và in.

... Tuy nhiên, không phải tất cả các phương ngữ sed đều có lệnh T và một số dường như không thích các tập lệnh được phân tách bằng dấu chấm phẩy.

Các vấn đề liên quan