Learn how to use the cut command in various scenarios and in scripting with lots of examples. Understand how to extract selective data using cut command.
Everybody in a Linux or Unix environment is familiar with
grep command which is used for pattern finding/filtering. This is a kind of selective data extraction from source data.
cut is another command which is useful for selective data extraction.
cut command basically extracts a portion of data from each line of a given file or supplied data. Syntax to be used for
cut command is –
# cut [options] [file]
Below different options can be used with cut command :
c To select only this number of character.
Roughly you can say its a column number to be extracted. See below example:
# cat test sd teh dxff cq2w31q5 # cut -b 4 test f w
cut is instructed to select only 4th character. If you look closely, in the output it shows only 4th column letters. Lines which are having less than 4 characters are shown blank in cut output!
This option is useful in scripting when there is a need for single-column extraction from supplied data.
-b To select only this number of bytes.
This option tells the command to select only a given number of a byte from each line of data and show in the output. In most cases, its output is the same as
-c option since each character is treated as one byte in a human-readable text file.
-d Use specified delimiter instead of TAB
Normally cut uses tab as a delimiter while filtering data. If your file has different delimiter like a comma
, in CSV file or colon
: in /etc/passwd file then you can specify this different delimiter to cut command. Command will process data accordingly. This option should always be used with
f options. Only using
-d option will result in below error :
# cut -d a test cut: you must specify a list of bytes, characters, or fields Try `cut --help' for more information.
-f To select only specified number of fields.
This option is to specify which all fields to be filtered from data. This option if not supplied with delimiter character data (
-d option/ no TAB in data) then it will print all lines. For example, if you say
-f 2 then it searches for TAB or supplied delimiter values if any in data. If found then it will print 2nd field from delimiter for that line. For lines where it won’t find delimiter, it will print the whole line.
# cat test this is test file raw data asdgfghtr data #cut -f1 test this is test file raw data asdgfghtr # cut -d" " -f2 test is data asdgfghtr data
Field numbering is as below:
Field one is the left side field from the first occurrence of the delimiter
Field second is the right-side field from the first occurrence of the delimiter
Fields third is the right-side second field from the first occurrence of the delimiter
Observe the above example, where it prints all lines as it is when the delimiter is not specified. When the delimiter is defined as single space ” ” then it prints field two according to numbering explained above.
-s To print only lines with delimiters
Missing delimiter causes cut to print the whole line as it is which may mislead the desired output. This is dangerous when the command is being used in scripts. Hence
-s option is available which restricts cut to display the whole line in case of missing delimiter.
# cut -f1 -s test
Using the same test file from the above example when
-s is specified then there is no output. This is because the default delimiter TAB does not exist in the file.
Number to be used with
In all the above examples, we have declared single integers like 2,4 for
-f options. But we can also use the below system :
- x: Single number like we used in all examples
- x-: From xth bye, character or field till end of line
- x-y: From xth byte, character or field till yth
- -y: From first byte, character or field till yth
# cut -d" " -f2- test is test file data asdgfghtr data # cut -d" " -f2-3 test is test data asdgfghtr data # cut -d" " -f-1 test this raw asdgfghtr data
Few examples of cut command :
To get a list of users from
/etc/passwd file, we will use delimiter as
: and cut out the first field.
# cut -d: -f1 /etc/passwd root bin daemon adm lp ------ output clipped -----
cut command can be feed with data from the pipe as well. In that case last
[file] parameter shouldn’t be defined. Command will read input from pipe and process data accordingly. For example, we are grep ing user with uid 0 and then getting their usernames using cut like below:
# cat /etc/passwd |grep :0: | cut -d: -f1 root sync shutdown halt operator
Getting userid and group id from
/etc/passwd file along with their usernames.
# cat /etc/passwd |cut -d: -f1-4 root:x:0:0 bin:x:1:1 daemon:x:2:2 adm:x:3:4 lp:x:4:7 sync:x:5:0