this post was submitted on 29 Jan 2025
12 points (100.0% liked)

Linux

49393 readers
1654 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
 

For a reason not worth mentioning here, I would like to write a somewhat more complex awk script in which I would have to explain in detail what I am doing. (If only so that I'll still know next week.) There doesn't seem to be a way to wrap a list of conditions in GNU awk, right?

This is what I tried:

command-that-prints-a-table | awk '
    NR>1 &&                # Skip line 1
    NF>2 &&                # Skip lines with only one column
    substr($1,1,1) != "("  # Skip lines that start with a "("
    { print $1 }
'

Alas, that does not work - awk skips the conditions entirely and only runs print $1. It seems that escaping the newlines does not work either, which makes sense as the end of the lines are comments.

This would work:

command-that-prints-a-table | awk '
# - Skip line 1
# - Skip lines with only one column
# - Skip lines that start with a "("
    NR>1 && NF>2 && substr($1,1,1) != "("  { print $1 }
'

But - my original code has a few more conditions - it is rather annoying to read and maintain. Is there an elegant way to fix this?

you are viewing a single comment's thread
view the rest of the comments
[–] tux0r@feddit.org 1 points 1 day ago (1 children)

Wouldn’t the backslash be a part of the comment?

[–] just_another_person@lemmy.world 2 points 1 day ago* (last edited 1 day ago) (1 children)

It a line continuation like so:

printf "This is going to be a really \ long line that I want to break \ into different segments"

I'm seeing references that this is supposed to work elsewhere as well.

[–] tux0r@feddit.org 1 points 1 day ago (1 children)

Sure, but that's inside a string:

$ printf "This is a   # let's break \
> long line."
This is a   # let's break long line.

awk remains unimpressed:

$ echo "This is a test.
> It has three lines, so I can
> test awk on it." | awk '
> NR>2    # Skip two lines. \
> { print $2 }   # should only print "awk"
> '
is
has
test awk on it.
awk
[–] just_another_person@lemmy.world 1 points 1 day ago* (last edited 1 day ago) (1 children)

It works with long commands as well. Thinking in awk though, I would only use it after a statement is complete. You wouldn't be able to split up expressions like this, but if you're just talking about making it more readable, it should work.

Backslash works for long commands as well, but it's not going to split up an expression or string properly.

Works: apt install package1 \ package2 \ package3

Won't work: apt install pack\ age1 package2 pack\ age3

You can get cleaner code by substituting content blocks as variables, or piping EOF in and out at various places as other options.

[–] tux0r@feddit.org 1 points 1 day ago (1 children)

You wouldn’t be able to split up expressions like this

Ah, that already answers my original question. A pity!

[–] just_another_person@lemmy.world 1 points 1 day ago (1 children)

If cleaner is all you want, and you don't specifically care about the tool, maybe look at pyp

[–] tux0r@feddit.org 3 points 1 day ago

Ah, I could probably use Perl or something as well. I was hoping awk could do it though. But thank you, I hadn't heard about pyp before!