this post was submitted on 15 Apr 2025
22 points (95.8% liked)

Linux

53572 readers
1373 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 5 years ago
MODERATORS
22
Help with sed commands (lemmy.dbzer0.com)
submitted 1 week ago* (last edited 1 week ago) by orsetto@lemmy.dbzer0.com 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
[–] orsetto@lemmy.dbzer0.com 3 points 1 week ago (1 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

[–] smeg@feddit.uk 2 points 1 week ago* (last edited 1 week ago) (1 children)

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 2 points 1 week 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.