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
  • orsetto@lemmy.dbzer0.comOP
    link
    fedilink
    arrow-up
    0
    ·
    7 days ago

    I meant to ask what is the difference between, i.e., sed '/myregex/ s/from/to/ p' and sed '/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 ehe

    Right, awk is a proper programming language, right? that’ll be for another day…

    • gnuhaut@lemmy.ml
      link
      fedilink
      arrow-up
      0
      ·
      7 days ago

      Oh yeah that, so technically (and I was confused about this), the p in s/from/to/p is not the same as the p command, it’s a flag for the s 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 the p has no address range (e.g. regex) associated with it, so it gets executed for all the lines.

      • orsetto@lemmy.dbzer0.comOP
        link
        fedilink
        arrow-up
        0
        ·
        7 days ago

        I see. I guess what confused me was that i didn’t understand what addresses were.

        Thank you for your explanations :)