• 0 Posts
  • 5 Comments
Joined 2 years ago
cake
Cake day: July 24th, 2023

help-circle
  • In the end I’ve used the first command you wrote, because KISS, but I appreciate your explanation

    There’s no shame in combining multiple tools, that’s what pipelines are all about 😄.

    Also there’s a different tool that I would use if I want to output a specific column: awk

    df -h —output=avail,source | awk ‘/\/dev\/dm-2/ {print $1}’
    

    For lines matching /dev/dm-2 print the first column. awk splits columns on whitespace by default.

    But I would probably use grep+awk.

    Sed is definitely a very powerful tool, which leads to complex documentation. But I really like the filtering options before using the search/replace.

    You can select specific lines, with regex or by using a line number; or you can select multiple lines by using a comma to specify a range.

    E.g. /mystring/,100s/input/output/g: in the lines starting from the first match of /mystring/ until line 100, replace input with output


  • The easiest way is probably without sed, which you mentioned:

    df -h --output=avail /dev/dm-2| tail -n1
    

    But purely with sed it would be something like this:

    df -h --output=avail,source | sed -n ‘/\/dev\/dm-2/s!/dev/dm-2!!p’
    

    -n tells 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.

    p prints the result

    Check the sed man page for more details: https://linux.die.net/man/1/sed