Help with sed commands (lemmy.dbzer0.com)
submitted 2 years ago* (last edited 2 years ago) by to c/linux@lemmy.ml
 

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
you are viewing a single comment's thread
view the rest of the comments
[–] 10 points 2 years ago (4 children)

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}'

  • source
  • hideshow 4 child comments
  • [–] [S] 3 points 2 years ago (2 children)

    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

  • source
  • parent
  • hideshow 2 child comments
  • [–] 2 points 2 years ago* (1 child)

    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.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 2 points 2 years 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.

  • source
  • parent