Use space as a delimiter with cut command
You can also say:
cut -d\ -f 2
Note that there are two spaces after the backslash.
To complement the existing, helpful answers; tip of the hat to QZ Support for encouraging me to post a separate answer:
Two distinct mechanisms come into play here:
(a) whether
cut
itself requires the delimiter (space, in this case) passed to the-d
option to be a separate argument or whether it's acceptable to append it directly to-d
.(b) how the shell generally parses arguments before passing them to the command being invoked.
(a) is answered by a quote from the POSIX guidelines for utilities (emphasis mine)
If the SYNOPSIS of a standard utility shows an option with a mandatory option-argument [...] a conforming application shall use separate arguments for that option and its option-argument. However, a conforming implementation shall also permit applications to specify the option and option-argument in the same argument string without intervening characters.
In other words: In this case, because -d
's option-argument is mandatory, you can choose whether to specify the delimiter as:
- (s) EITHER: a separate argument
- (d) OR: as a value directly attached to
-d
.
Once you've chosen (s) or (d), it is the shell's string-literal parsing - (b) - that matters:
With approach (s), all of the following forms are EQUIVALENT:
-d ' '
-d " "
-d \<space> # <space> used to represent an actual space for technical reasons
With approach (d), all of the following forms are EQUIVALENT:
-d' '
-d" "
"-d "
'-d '
d\<space>
The equivalence is explained by the shell's string-literal processing:
All solutions above result in the exact same string (in each group) by the time cut
sees them:
(s):
cut
sees-d
, as its own argument, followed by a separate argument that contains a space char - without quotes or\
prefix!.(d):
cut
sees-d
plus a space char - without quotes or\
prefix! - as part of the same argument.
The reason the forms in the respective groups are ultimately identical is twofold, based on how the shell parses string literals:
- The shell allows literal to be specified as is through a mechanism called quoting, which can take several forms:
- single-quoted strings: the contents inside
'...'
is taken literally and forms a single argument - double-quoted strings: the contents inside
"..."
also forms a single argument, but is subject to interpolation (expands variable references such as$var
, command substitutions ($(...)
or`...`
), or arithmetic expansions ($(( ... ))
). \
-quoting of individual characters: a\
preceding a single character causes that character to be interpreted as a literal.
- single-quoted strings: the contents inside
- Quoting is complemented by quote removal, which means that once the shell has parsed a command line, it removes the quote characters from the arguments (enclosing
'...'
or"..."
or\
instances) - thus, the command being invoked never sees the quote characters.
Usually if you use space as delimiter, you want to treat multiple spaces as one, because you parse the output of a command aligning some columns with spaces. (and the google search for that lead me here)
In this case a single cut
command is not sufficient, and you need to use:
tr -s ' ' | cut -d ' ' -f 2
Or
awk '{print $2}'
cut -d ' ' -f 2
Where 2 is the field number of the space-delimited field you want.