Contents
- Common Separated Values
- Print the first field out of a CSV file
- Print the first field out of CSV output from another command
- Print the first, second, and seventh field out of a CSV file
- Print text based on Spaces
- Print the fourth field and everything after that from a command
- Print up to the 4th field
- Print all fields between 5 and 8
- Output with a different delimiter (make a CSV)
- Output only lines that have a delimiter
- Bytes
- Characters
The cut command is a Unix/Linux tool used to literally cut text from files and output from other commands. With the cut command a user can take text and output only certain parts of the line.
In my opinion cut is the most under recognized and utilized command in Linux/Unix. This is mostly due to the fact that when most Sysadmins want to cut text from files or standard output many will reach for AWK.
While AWK is a great tool for quick and dirty commands; I tend to reach for cut before AWK. The below cheat sheet should show many ways to use cut with every day tasks.
Common Separated Values
Print the first field out of a CSV file
$ cut -d: -f1 passwd.bak root daemon
Print the first field out of CSV output from another command
$ head -1 /etc/passwd | cut -d: -f1 root
Print the first, second, and seventh field out of a CSV file
To change the field simply change the numbers after -f separated by a comma.
$ cut -d: -f1,2,7 passwd.bak root:x:/bin/bash
Print text based on Spaces
$ cut -d\ -f3 /etc/motd Ubuntu
Print the fourth field and everything after that from a command
This command is pretty handy if you wanted to make a script out of the past few commands you ran.
$ history | cut -d\ -f 4- ping google.com
Print up to the 4th field
$ cut -d\ -f-4 /etc/motd Welcome to Ubuntu 12.04
Print all fields between 5 and 8
$ cut -d: -f5-8 passwd root:/root:/bin/bash
Output with a different delimiter (make a CSV)
Convert : to ,
$ cut --output-delimiter=, -d: -f1- passwd root,x,0,0,root,/root,/bin/bash
Convert space to ,
$ ps -elf | cut --output-delimiter=, -d\ -f1- F,S,UID,,,,,,,,PID,,PPID,,C,PRI,,NI,ADDR,SZ,WCHAN,,STIME,TTY,,,,,,,,,,TIME,CMD 4,S,root,,,,,,,,,1,,,,,0,,0,,80,,,0,-,,6083,poll_s,19:07,?,,,,,,,,00:00:12,/sbin/init
Output only lines that have a delimiter
This command will only output lines that have a : (in our example), within the file tmpfile there are multiple lines some with : and some without.
$ head tmpfile Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-29-generic x86_64)73 packages can be updated. 10 updates are security updates.root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync$ cut -s -d: -f1-4 tmpfile root:x:0:0 daemon:x:1:1 bin:x:2:2 sys:x:3:3 sync:x:4:65534
Bytes
Print bytes 1 through 45
$ cut -b1-45 /etc/motd Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-
Print everything but bytes 10 through 45
$ cut --complement -b10-45 /etc/motd Welcome t29-generic x86_64)
Characters
Print characters 1 through 25
$ cut -c1-25 /etc/motd Welcome to Ubuntu 12.04 L
Print everything but characters 10 through 25
$ cut --complement -c10-25 /etc/motd Welcome tTS (GNU/Linux 3.2.0-29-generic x86_64)
Hi there! Great examples, did not know the –complement and –output-delimiter options: Good to know. Though I continue to reach for awk whenever there is a chance: I have encountered too many illegibaly chained cut’s with head’s, that would be so much clearer to have in awk…
Anyhow: Please put a huge banner everywhere that your cms is stealing valuable double spaces ;)
Fixed the double space, thanks for the heads up on that.
awk has its place and if you have more then 3 cut’s in one command line and you could have done it with 1 awk line. Then you might as well use awk. I try to make my commands history friendly, but also keep them quick and dirty as well.