Cut command in Linux

1.0 cut

Cut command in Linux

The cut command cuts sections of each line of input files and writes it on its standard output. It is mostly used for taking out a few columns from the input files. The command syntax is,

cut option... [FILE]...

You can cut out bytes, characters or fields from files.

2.0 Cut fields

The most common use is to cut fields. The default field delimiter is the tab character. The field number starts with 1. For example, to get a list of second names in the names file, we can give the command,

$ cat names
Erika Mustermann
Jane Doe
Joe Bloggs
John Doe
John Roe
Max Mustermann
Richard Roe
Tommy Atkins
$ cut -f2 -d' ' names
Mustermann
Doe
Bloggs
Doe
Roe
Mustermann
Roe
Atkins

The -f option specifies the field to be cut. The -d option specifies the field delimiter.

3.0 Specifying field numbers

We can cut multiple fields. For example, if we want a list of user ids along with the default shell, we can cut out the first and the seventh fields from /etc/passwd, using : as the delimiter.

$ cut -f1,7 -d':' /etc/passwd
root:/bin/bash
daemon:/usr/sbin/nologin
bin:/usr/sbin/nologin
sys:/usr/sbin/nologin
sync:/bin/sync
games:/usr/sbin/nologin
...

While specifying field numbers, we can give ranges like, m-n. A range -n means fields 1 through n. Similarly, a range m- means fields m through till the last field. For example,

$ cut -f-3,5,6- -d':' /etc/passwd | head
root:x:0:root:/root:/bin/bash
daemon:x:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:bin:/bin:/usr/sbin/nologin
sys:x:3:sys:/dev:/usr/sbin/nologin
sync:x:4:sync:/bin:/bin/sync
games:x:5:games:/usr/games:/usr/sbin/nologin
man:x:6:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:news:/var/spool/news:/usr/sbin/nologin

4.0 Complement of selected fields

The cut command selects fields identified with the -f option. We can find the complement of these fields using the --complement option. For example,

$ cut -f-3 -d':' /etc/passwd | head
root:x:0
daemon:x:1
bin:x:2
sys:x:3
sync:x:4
games:x:5
man:x:6
lp:x:7
mail:x:8
news:x:9
$
$ cut --complement -f-3 -d':' /etc/passwd | head
0:root:/root:/bin/bash
1:daemon:/usr/sbin:/usr/sbin/nologin
2:bin:/bin:/usr/sbin/nologin
3:sys:/dev:/usr/sbin/nologin
65534:sync:/bin:/bin/sync
60:games:/usr/games:/usr/sbin/nologin
12:man:/var/cache/man:/usr/sbin/nologin
7:lp:/var/spool/lpd:/usr/sbin/nologin
8:mail:/var/mail:/usr/sbin/nologin
9:news:/var/spool/news:/usr/sbin/nologin

5.0 Suppress lines not containing the delimiter

By default, if a line did not contain the delimiter, it is printed in the output. We can suppress printing of lines not containing the delimiter using the -s option. For example, if the password file had a few comments at the top,

$ cut -f-3 -d':' passwd | head
# The system password file.
# Please ensure that this file is accessible to administrators only.

root:x:0
daemon:x:1
bin:x:2
sys:x:3
sync:x:4
games:x:5
man:x:6
$
$ cut -f-3 -d':' -s passwd | head
root:x:0
daemon:x:1
bin:x:2
sys:x:3
sync:x:4
games:x:5
man:x:6
...

6.0 Specifying output delimiter

The output need not contain the abstruse delimiter of the input file. We can set the output delimiter string using the --output-delimiter option. For example,

$ cut -f1,7 -d':' --output-delimiter '   ' /etc/passwd
root   /bin/bash
daemon   /usr/sbin/nologin
bin   /usr/sbin/nologin
sys   /usr/sbin/nologin
sync   /bin/sync
games   /usr/sbin/nologin
...

7.0 Cutting out bytes, characters

The above discussion focused on cutting fields from files. We can cut bytes and characters from files by framing similar commands, replacing -f with the -b option for bytes and -c option for characters, respectively. In case of bytes and characters, the input delimiter is not meaningful and can not be specified as a part of the command. The byte and character numbers start from one for each line.