Bob
Have a question related to this hub?
Alice
Got something to say related to this hub?
Share it here.
cut | |
---|---|
Original author(s) | AT&T Bell Laboratories |
Developer(s) | Various open-source and commercial developers |
Initial release | February 1985 |
Operating system | Unix, Unix-like, IBM i |
Platform | Cross-platform |
Type | Command |
License | coreutils: GPLv3+ |
cut
is a shell command that extracts sections from each line of input text — usually from a file. Extraction of line segments can typically be done by bytes (-b
), characters (-c
), or fields (-f
) separated by a delimiter (-d
— the tab character by default). A range must be provided in each case which consists of one of N
, N-M
, N-
(N
to the end of the line), or -M
(beginning of the line to M
), where N and M are counted from 1 (there is no zeroth value). Since version 6, an error is thrown if you include a zeroth value. Prior to this the value was ignored and assumed to be 1.
The original Bell Labs version was written by Gottfried W. R. Luderer.[1][2] The command is part of the X/Open Portability Guide since issue 2 of 1987. It was inherited into the first version of POSIX.1 and the Single Unix Specification.[3] It first appeared in AT&T System III UNIX in 1982.[4]
The command is commonly available on Unix and Unix-like operating systems. It is part of the BSD Base System. The version in GNU coreutils was written by David M. Ihnat, David MacKenzie, and Jim Meyering.[5] The command is available for Windows via UnxUtils.[6] The command was ported to the IBM i operating system.[7]
The command line consists of options and an optional file path. If no path is specified than standard input will be used.
Options include:
cut -b1-66
would return the first 66 bytes of a line. NB If used in conjunction with -n, no multi-byte characters will be split. NNB. -b will only work on input lines of less than 1023 bytescut -c1-66
would return the first 66 characters of a lineGiven a file named foo
with content:
foo:bar:baz:qux:quux one:two:three:four:five:six:seven alpha:beta:gamma:delta:epsilon:zeta:eta:theta:iota:kappa:lambda:mu the quick brown fox jumps over the lazy dog
To output the fourth through tenth characters of each line:
$ cut -c 4-10 foo
:bar:ba
:two:th
ha:beta
quick
To output the fifth field through the end of the line of each line using the colon character as the field delimiter:
$ cut -d ":" -f 5- foo
quux
five:six:seven
epsilon:zeta:eta:theta:iota:kappa:lambda:mu
the quick brown fox jumps over the lazy dog
Because the colon is not found in the last line, the entire line is shown.
Option -d
specifies a single character delimiter (in the example above it is a colon) which serves as field separator. Option -f
which specifies range of fields included in the output (here fields range from five till the end). Option -d
presupposes usage of option -f
.
To output the third field of each line using space as the field delimiter:
$ cut -d " " -f 3 foo
foo:bar:baz:qux:quux
one:two:three:four:five:six:seven
alpha:beta:gamma:delta:epsilon:zeta:eta:theta:iota:kappa:lambda:mu
brown
Because the space character is not found in the first three lines these entire lines are shown.
To separate two words having any delimiter:
$ line=process.processid
$ cut -d "." -f1 <<< $line
process
$ cut -d "." -f2 <<< $line
processid