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
  • smeg@feddit.uk
    link
    fedilink
    English
    arrow-up
    6
    ·
    10 hours ago

    Are you opposed to using 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@lemmy.dbzer0.comOP
      link
      fedilink
      arrow-up
      3
      ·
      9 hours ago

      Are you opposed to using awk?

      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@feddit.uk
        link
        fedilink
        English
        arrow-up
        2
        ·
        edit-2
        2 hours ago

        I had to check the syntax because I also don’t use it enough to be sure, definitely a bit weird. Basically just grep for a regex and print the specified column.

        • thingsiplay@beehaw.org
          link
          fedilink
          arrow-up
          2
          ·
          54 minutes ago

          Just a thumb of rule to make sense of it: A column in AWK is by default any space separated part. You can change the column separator to any other character too with -F ":" in example would be a double colon. There is also a way to print all columns, but with certain exceptions. In example print all, but the third and fourth columns: ls -l | awk '{$3=""; $4=""; print $0}' . Admittely I forget this syntax often and have to look for it again.