Help with sed commands
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

unlawfulbooger
in reply to orsetto • • •The easiest way is probably without sed, which you mentioned:
But purely with sed it would be something like this:
-ntells sed to not print lines by default/[regex]/selects the likes matching regex. We need to escape the slashes inside the regex.s///does search-and-replace, and has a special feature: it can use any character, not just a slash. So I used three exclamation points instead , so that I don’t need to escape the slashes. Here we replace the device with the empty string.pprints the resultCheck the sed man page for more details: linux.die.net/man/1/sed
orsetto
in reply to unlawfulbooger • • •This weired me out until I read the explanation. I'm so used to the slashes lol
In the end I've used the first command you wrote, because KISS, but I appreciate your explanation
Yes that's been my only source so far, but to be honest it's really cryptic. it might just be that I'm used to syscalls man pages (also sed is kinda complex it can't be easy to write a single man page for it)
gnuhaut
in reply to orsetto • • •You can do something like this to emulate grep:
The
-nsuppresses auto-printing. That command should interpreted as: find line matching/myregex/and then print (p) it.You can then combine this with
s(substitute):The complete command is then something like:
Note that output can be something like
2.3G, but in my locale that would be2,3Gwhich is why I addedLANG=C.Easier IMHO is awk:
prints the first field.
smeg
in reply to orsetto • • •awk? Printing out a specific column is basically the only thing I actually know how to do with it:df -h --output=avail,source | awk '/dm-2/ {print $1}'orsetto
in reply to smeg • • •Not at all, I'm just not familiar with it so I find it confusing.
Although, looking at your command, i think I understand what it means
smeg
in reply to orsetto • • •bizdelnick
in reply to orsetto • • •-noption and add thepmodifier to thes///command to print out lines where substitution has occured.sed -n 's/your-regexp/replacement/p