Hi all! I have always only used sed with s///
, becouse I’ve never been able to figure out how to properly make use of its full capabilities. Right now, I’m trying to filter the output of df -h --output=avail,source
to only get the available space from /dev/dm-2 (let’s ignore that I just realized df accepts a device as parameter, which clearly solves my problem).
This is the command I’m using, which works:
df -h --output=avail,source \
| grep /dev/dm-2 \
| sed -E 's/^[[:blank:]]*([0-9]+(G|M|K)).*$/\1/
However, it makes use of grep, and I’d like to get rid of it. So I’ve tried with a combiantion of t
, T
, //d
and some other stuff, but onestly the output I get makes no sense to me, and I can’t figure out what I should do instead.
In short, my question is: given the following output
$ df -h --output=avail,source
Avail Filesystem
87G /dev/dm-2
1.6G tmpfs
61K efivarfs
10M dev
...
How do I only get 87G
using only sed
as a filter?
EDIT:
Nevermind, I’ve figured it out…
$ df -h --output=avail,source \
| sed -E 's/^[[:blank:]]*([0-9]+(G|M|K))[[:blank:]]+(\/dev\/dm-2).*$/\1/; t; /.*/d'
85G
I meant to ask what is the difference between, i.e.,
sed '/myregex/ s/from/to/ p'
andsed '/myregex/ s/from/to/ ; p'
, but while testing to explain what i meant I answered myself, and in the process I also understood what addresses are eheRight, awk is a proper programming language, right? that’ll be for another day…
Oh yeah that, so technically (and I was confused about this), the
p
ins/from/to/p
is not the same as thep
command, it’s a flag for thes
command that tells it to print the output. You could do multiple commands like/re/ {s/a/b/;p}
for the same result, by using a{}
block.If you do, say,
/re/ s/a/b/; p
those would be separate command, the first does the thing on lines matching/re/
, while thep
has no address range (e.g. regex) associated with it, so it gets executed for all the lines.I see. I guess what confused me was that i didn’t understand what addresses were.
Thank you for your explanations :)