7 ms·
Awk is such a weird tool--it's powerful and so few people know how to leverage it. Yesterday, someone in chat wanted to extract special comments from their sou
by dietrichepp 4y ago
Awk is such a weird tool--it's powerful and so few people know how to leverage it.
Yesterday, someone in chat wanted to extract special comments from their source code and turn them into a script for GDB to run. That way they could set a break point like this:
void func(void) {
//d break
}
They had a working script, but it was slow, and I felt like most of the heavy lifting could be done with a short Awk command:
awk -F'//d[[:space:]]+' \
'NF > 1 {print FILENAME ":" FNR " " $2}' \
source/*.c
This one command find all of those special comments in all of your source files. For example, it might print out something like:
source/main.c:105 break
source/lib.c:23 break
The idea of using //d[[:space:]]+ as the field separator was not obvious, like many Awk tricks are to people who don't use Awk often (that includes me).
(One of the other cases I've heard for using Awk is for deploying scripts in environments where you're not permitted to install new programs or do shell scripting, but somehow an Awk script is excepted from the rules.)
- deepsun 4y agoJust like Perl. Most people prefer dumb verbose code, not smart terse.
- bobbylarrybobby 4y agoMost people prefer legible code, not hieroglyphics
- scubbo 4y ago(Honest question) what do you feel that your comment added to the one above it? Are you suggesting that "dumb verbose code" might not be legible (I suppose that's technically possible, but seems unlikely to happen by accident)? Or are you implying that Perl consists of "hieroglyphics" and so is not a suitable language for writing legible code? This, I think, would miss the point - deepsun was saying that, in both Perl and in awk, readers prefer legible code over cleverness - to claim that Perl cannot be legible at _all_ requires a little more justification, and would probably be disputed on the grounds that familiarity with a language's conventions is often a prerequisite for legibility.
- cerved 4y agonot OP but perhaps they are trying to say that terse code can be quite illegible I've written sed sripts and more compilated regular expressions that when I come back I don't remember what all that mess was supposed to accomplish
- dijonman2 4y agoI think it’s additive. We like to feel smart and can over complicate things. I much prefer a boring non-trendy approach that’s easy to maintain over new hotness every time.
- bobbylarrybobby 4y agoYes, I was basically saying that terse code is often unreadable due to the terseness coming from what amounts to a weird compression algorithm that can satisfy a compiler but buries information for humans in weird syntax instead of something resembling English.
- yakubin 4y agoThe question I prefer to ask is “how much functionality can I comprehend in a given amount of time” rather than “how many lines of code can I comprehend in a given amount of time”.
- statquontrarian 4y agoUnfortunately, the universal POSIX standard of awk only supports single-character, non-regular expression field separators (https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html https://pubs.opengroup.org/onlinepubs/9699919799/utilities/a...). It's arguable whether one should write POSIX-compliant awk or not (similar arguments apply for shell scripting). When feasible, I try to write POSIX-compliant awk, so the script could have been written as: awk '/\/\/d / {gsub(/.*\/\/d /, ""); print FILENAME ":" FNR " " $0; }' source/*.c
- dietrichepp 4y agoI thought about this, but both the macOS Awk and GNU Awk support regexps as field separators.
- xani_ 4y agoI just write Perl instead
- d3nj4l 4y agoyeah people say perl is write only but I guarantee it's less write only than that awk incantation
- dietrichepp 4y agoThat "Awk incantation" looks clear to me. - On lines that contain //d, - Delete the part of the line up to and including //d, - Print the file, line number, and the rest of the line. Maybe it's familiarity with regular expressions? If you're not familiar with regular expressions, that Awk is gonna look a bit funny. The regular expressions look a bit messy just because they have to match literal slashes, so you get /\/\/ There is no use of funny features or clever tricks in the code, it's just kind of straightforward, mindless code that does exactly what it says it does. It's definitely less clever than the Awk invocation that I wrote (which is a good thing).
- 4y ago
- wruza 4y agoit's powerful and so few people know how to leverage it Because otherwise it is useless. It has the same fate as AHK scripting and similar little languages. The language may be okay for its task, but if you cannot or do not use it for other things (unlike e.g. perl) at least from time to time, chances that you will learn and remember it are low. People know sed because regexps are everywhere. People use perl instead of awk, because they have a muscle memory for it. They may know [, find and glob for their relative generic-ness. They ignore awk and ahk because these are too niche to pay enough attention to. You either find a snippet or just move on. If you are not constrained by a single line in a script, it’s easier to feed a heredoc into an interpreter of choice.
- deleted 4y ago[deleted]
- brokenmachine 4y agoahk is a lot easier than any alternatives for a lot of Windows stuff like window management. I use ahk scripts to arrange my windows for me and some other simple hotkey things. Wouldn't use it for "real" programming stuff though.
- wruza 4y agoYes, ahk is a great framework for its purpose. It’s hard to repeat it from scratch. But it would hugely benefit from literally any mainstream language around it. Imagine how many plugins simply wouldn’t exist or delivered quickly if e.g. vscode invented its own arcane vscodescript instead of js/ts. Or how richer desktop automation could be if ahk could use pip, npm, IDEs and interop other “junction” tech seamlessly.
- jleahy 4y agoAs an aside, I find a little macro that expands to asm(“int3”) is useful for this.