22
Help with sed commands (lemmy.dbzer0.com)
submitted 5 days ago* (last edited 5 days 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
[-] gnuhaut@lemmy.ml 8 points 5 days ago* (last edited 5 days ago)

You can do something like this to emulate grep:

sed -n '/myregex/p'

The -n suppresses auto-printing. That command should interpreted as: find line matching /myregex/ and then print (p) it.

You can then combine this with s (substitute):

sed '/myregex/ s/from/to/ p`

The complete command is then something like:

LANG=C df -h --output=avail,source | sed -n '/\/dev\/nvme0n1p2/ s/^\s*\([0-9.]\+[KMGT]\).*/\1/ p'

Note that the output can be something like 2.3G, but in my locale that would be 2,3G which is why I added LANG=C.

Easier IMHO is awk:

awk '/myregex/ {print $1}'

prints the first field.

[-] bizdelnick@lemmy.ml 2 points 4 days ago

You can then combine this with s (substitute):

sed '/myregex/ s/from/to/ p'

This is not combining commands. In your example p is a modifier to the s/// command.

[-] gnuhaut@lemmy.ml 2 points 4 days ago

Yeah you're right, thanks. I did figure this out on my own already, see my other comment:

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.

[-] orsetto@lemmy.dbzer0.com 2 points 5 days ago

The -n suppresses auto-printing

That's something I was missing! It makes the command look definitely less complicated.

Also, what is the difference between separating expressions with a space vs with a semicolon?

Easier IMHO is awk

Eh, that's another beast. For some reason tho I find sed more appealing.

[-] gnuhaut@lemmy.ml 2 points 5 days ago

What expressions?

I mean awk is more powerful, it has variables, function, can do arithmetic and format strings, and such proper scripting language features. And the GNU awk manual is rather well written.

[-] orsetto@lemmy.dbzer0.com 2 points 5 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 2 points 5 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.com 2 points 5 days ago

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

Thank you for your explanations :)

[-] gnuhaut@lemmy.ml 1 points 5 days ago

Yeah no problem.

What's maybe interesting is how sed came to be. Back in early days of Unix, they had ed as their editor (or, as some old manpage says, "Ed is the standard text editor.")

Sed has basically the same commands as ed. You typed 3d to delete the third line, or 10,20p to print lines 10 to 20. They only had teletypes back then, which are basically a keyboard and dot-matrix printer with one of those continuous papers for output, prior to when hardware terminals with CRT screens were a thing.

Anyway, someone thought it would be useful if you could put ed-style editing commands inside shell pipelines, and ed doesn't work for that. It is used for interactively editing files in place, and so gets commands from stdin. You can't pipe any files into it. So the "stream editor", sed, was born.

Also interesting: There were improved modified versions of ed going around like em and later ex. The original vi was a "visual mode" extension for ex, and you can still run ex/ed commands from vi by typing : first, e.g. you can delete line 3 by typing :3d inside vi.

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

Linux

53346 readers
600 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