Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 4 Oct 2015 23:12:48 -0453.75
From:      "William A. Mahaffey III" <wam@hiwaay.net>
Cc:        FreeBSD Questions !!!! <freebsd-questions@freebsd.org>
Subject:   Re: awk question
Message-ID:  <5611F776.9090701@hiwaay.net>
In-Reply-To: <20151005042129.1f153ec6.freebsd@edvax.de>
References:  <5611C922.4050007@hiwaay.net> <20151005042129.1f153ec6.freebsd@edvax.de>

next in thread | previous in thread | raw e-mail | index | archive | help
On 10/04/15 21:27, Polytropon wrote:
> On Sun, 4 Oct 2015 19:55:08 -0453.75, William A. Mahaffey III wrote:
>> I am using awk & smartctl in a small shell script to print out HDD temps
>> in a purty format, 1 line per drive. As it happens, the output I want is
>> spread out over 4 lines of smartctl out, requiring (I *think*) 4 calls
>> to smartctl each piped to its own awk invocation to pull out the line I
>> want & print its info out. Is there some way to get awk to consider more
>> than 1 line at a time ? In my case my 4 lines are indeed sequential, &
>> it would be a bit more efficient if I could process all 4 lines once I
>> found the 1st one. This is definitely *not* critical, what I have now
>> works AOK, I was/am just curious if it could be optimized a bit. TIA &
>> have a good one.
> I'm not sure I understand your question correctly, as you're not
> providing some example input data and what output you want. But
> awk can process one line against multiple patterns, and if, let's
> say, 4 patterns match, 4 lines will be output:
>
> 	smartctl <params> | awk '
> 		/pattern1/
> 		/pattern2/
> 		/pattern3/
> 		/pattern4/
> 	' > out.txt
>
> If no action is provided, the whole line will be printed; if you
> just want some (maybe postprocessed) fields of a line, add
>
> 	{ print <whatever }
>
> to each pattern. Another way is "counting down" the amount of
> additional lines after one pattern has been found:
>
> 	smartctl <params> | awk '
> 		{
> 			if (nextlines > 0) {
> 			        print;
> 				nextlines--;
> 			}
> 		}
> 		/pattern/ {
> 			nextlines = 4;
> 		}
> 	' > out.txt
>
> The first block without a pattern will always be executed
> (in this case, "print" is the command that will be called
> for all desired lines), and the one with a pattern that
> will "trigger" that first block to actually output something.
>
>
>
> By the way: If there is no processing, and you just need some
> data lines as is, why not use grep?
>
> 	smartctl <params> | grep "<pattern>" -A 4 > out.txt
>
> See "man grep" for details on the -A option.


Good point, here is the relevant part of the smartctl output:

[root@kabini1, /etc, 7:10:34pm] 915 % smartctl -l scttemp /dev/ada0
smartctl 6.4 2015-06-04 r4109 [FreeBSD 9.3-RELEASE-p24 amd64] (local build)
Copyright (C) 2002-15, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SCT Status Version:                  3
SCT Version (vendor specific):       256 (0x0100)
SCT Support Level:                   1
Device State:                        Active (0)
Current Temperature:                    27 Celsius
Power Cycle Min/Max Temperature:     23/31 Celsius
Lifetime    Min/Max Temperature:     19/33 Celsius
Lifetime    Average Temperature:        23 Celsius
Under/Over Temperature Limit Count:   0/0

I am invoking smartctl 4 times per drive to extract & process (print in 
my own format) the 4 lines beginning w/ 'Current Temperature:'. I want 
the resulting output in 1 line per drive as such (for 4 drives):

[root@kabini1, /etc, 7:32:53pm] 456 % hddtemp /dev/ada[0-3]
SMART supported, SMART enabled
drive /dev/ada0: HGST HTS721010A9E630, S/N: JR10006PGYH08E, Temp. 27 
degC, min/max, cycle: 23/31, lifetime: 19/33, lifetime avg. 23 degC
drive /dev/ada1: HGST HTS721010A9E630, S/N: JR10006PGYD6ZE, Temp. 28 
degC, min/max, cycle: 24/33, lifetime: 20/33, lifetime avg. 24 degC
drive /dev/ada2: HGST HTS721010A9E630, S/N: JR10006PGYTR8E, Temp. 27 
degC, min/max, cycle: 24/33, lifetime: 19/33, lifetime avg. 24 degC
drive /dev/ada3: HGST HTS721010A9E630, S/N: JR10006PGYK1YE, Temp. 27 
degC, min/max, cycle: 23/31, lifetime: 19/33, lifetime avg. 23 degC
[root@kabini1, /etc, 7:32:58pm] 457 %

Funny you mention grep, I had a similar conversation on the NetBSD list 
last week & everyone there suggested using awk alone to 'grep' out the 
lines I wanted. However, over there, the temp output I wanted was all in 
1 line, just not formatted as I wanted it. I think your 1st suggested 
method above will work AOK (if I understand it correctly, I will try it 
directly. Thanks :-) ....


-- 

	William A. Mahaffey III

  ----------------------------------------------------------------------

	"The M1 Garand is without doubt the finest implement of war
	 ever devised by man."
                            -- Gen. George S. Patton Jr.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5611F776.9090701>