All it required from me was to intentionally and manually type it down by hand instead of copy-pasting, on two purposeful occasions (within two minutes). Since then it's successfully saved in my brain.
All it required from me was to intentionally and manually type it down by hand instead of copy-pasting, on two purposeful occasions (within two minutes). Since then it's successfully saved in my brain.
echo "foo bar" | jq -Rr 'split(" ")[0]' # prints foo
I say 'almost', because jq right now can't invoke sub processes from within, unlike awk and bash. But otherwise, it's a fully fledged, functional, language. $ echo -e "10:20: hello\n20:39: world" | jq -cR 'capture("^(?<timestamp>.*): (?<message>.*)$")'
{"timestamp":"10:20","message":"hello"}
{"timestamp":"20:39","message":"world"}
$ echo -e "10:20: hello\n20:39: world" | jq -Rn '[inputs | capture("(?<t>.*): (?<m>.*)$").m] | join(" ")'
"hello world"
Also using inputs/0 etc in combination with reduce and foreach it's possible to process streams of text that might not end.for selecting the second column, PID, from `ps aux`,
ps aux | awk '{print $2}'
works for me, as gawk's default $FS field separator treats runs of whitespaces as a single separation of fields ( https://www.gnu.org/software/gawk/manual/html_node/Field-Spl... ), quite similar to "standard" Open Group/POSIX awk ( https://pubs.opengroup.org/onlinepubs/9799919799/utilities/a... ). ps aux | jq -Rr 'split(" ")[1]'
on the other hand doesn't work here due to `ps aux` adding a variable number of spaces for formatting. ps aux | jq -Rr 'split("\\s+"; null)[1]'
seems to work though.E.g. for the `ps aux` example, using PowerShell, selecting a certain column:
gps | select id
The output of gps is an array of objects. Selecting a property does this for all elements in the array.The canonical shell tool to split fields is cut. Easy to use, simple to read.
For the very common use case to set variables to fields, use the shell built-in read. It uses the same IFS as the rest of the shell.
The main reason for this is that it's easy to add a grep-like step there, without invoking another tool. So I can add a range-test, a literal-test, or something more complex than I could do with grep.
In short I can go from:
awk '{ print $2 }'
To this, easily: awk '$1 == "en4:" {print $NF}'echo '999 888' | awk '{print $2}'
prints 888
echo '999 888' | cut -f2 -d " "
except for the default delimiter being space for awk? echo '999 888' | cut -f2 -d " " # notice two consecutive spaces
returns NULL. echo '999 888' | tr -s " " | cut -f2 -d " "