cut - remove sections from each line of files
cut 可以对文件中的每一行进行裁剪。常用选项:
-d : 指定分隔符 ,与-f一起使用
-f : 用-d将文本分隔成一段一段后,-f用来取出第几段
-c : 指定取出第几个字符,也可以指定从第N个到第M个按区间取
示例1 查出last中有哪些人登录过
root@~$ last
root pts/0 192.168.18.1 Wed Apr 3 06:16 still logged in
root pts/2 192.168.18.1 Mon Oct 15 20:09 - 11:26 (15:17)
root pts/1 192.168.18.1 Mon Oct 15 19:28 - 15:18 (24+19:50)
root pts/0 192.168.18.1 Sun Oct 14 11:36 - 06:52 (1+19:16)
root pts/0 192.168.18.1 Sun Oct 14 10:44 - 11:36 (00:51)
root pts/0 192.168.18.1 Sun Oct 14 09:59 - 10:44 (00:44)
hadoop pts/1 namenode Sun Oct 7 09:02 - 09:02 (00:00)
hadoop pts/1 namenode Sun Oct 7 09:02 - 09:02 (00:00)
root@~$ last | cut -d ' ' -f 1
root
root
root
root
root
root
hadoop
hadoop
示例2 將 export 输出的内容,取第12字符以后的所有字串
root@~$ export
declare -x CLASSPATH=".:/tools/jdk/jdk1.8.0_171/lib.tools.jar"
declare -x HADOOP_HOME="/tools/hadoop/hadoop-2.8.4"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="namenode"
export 输出的内容前面都有 declare -x
,去掉它:
root@~$ export | cut -c 12-
CLASSPATH=".:/tools/jdk/jdk1.8.0_171/lib.tools.jar"
HADOOP_HOME="/tools/hadoop/hadoop-2.8.4"
HISTCONTROL="ignoredups"
HISTSIZE="1000"
HOME="/root"
HOSTNAME="namenode"
12- 表示从第12个字符到行结尾的意思
示例3 cut 如何按多个空格分割
对于那些有多个空格分隔的文本,例如:
root@~$ ps axu | grep 'ssh'
root 1250 0.0 0.0 112796 260 ? Ss 3月31 0:00 /usr/sbin/sshd -D
root 6323 0.0 0.5 158800 5672 ? Ss 08:04 0:00 sshd: root@pts/0
实际上仅靠cat是不行的,cat的-d选项只能对已确定的空格数做分割,-d也不支持正则(\s+)。这时其实一般会用awk来做。但如果一定要用cut的话,需要结合其他命令。如下是2种有效的方案:
方案1 先用sed命令将多个空格替换为1个
ps axu | grep 'ssh' | sed 's/\s\s*/ /g' | cut -d ' ' -f5
方案2 用tr -s 把多个空格替换为1个
ps axu | grep 'ssh' | tr -s ' ' | cut -d ' ' -f5
sort可以对文本中的行进行排序,常用选项:
-f :忽略大小写
-b :忽略前面的空白部分(ignore leading blanks)
-M :以月份的名字來排序,(‘JAN’ < … < ‘DEC’)
-n :按数字方式排序(默认是按字符串方式排序)
-r :反向排序;
-u :就是 uniq ,重复的只输出一次
-t :分隔符,默认是按[TAB]来分隔;
-k :分隔后以第几个区间(field)来排序
示例1:将/etc/passwd 的内容按":"号分隔,以第3个区间用数字方式排序
root@~$ cat /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
hadoop:x:1000:1000::/home/hadoop:/bin/sh
root@~$ cat /etc/passwd | sort -t ':' -k3,3 -n
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
hadoop:x:1000:1000::/home/hadoop:/bin/sh
-k3,3 是指仅以第3个区间排序,-k3,4表示以第3到第4个区间的内容排序,-k3 则代表从第3个区间到结尾的内容
示例2:将last 中的登录账户名排序后去重输出
root@~$ last | cut -d ' ' -f1 | sort -u
hadoop
reboot
root
wtmp
-u 选项就是uniq的意思。上面结果有一空行。那确实是last输出的。要想去掉的话,可以用sed删除空行。
root@~$ last | cut -d ' ' -f1 | sort -u | sed '/^$/d'
hadoop
reboot
root
wtmp
uniq命令可以在排序后处理重复的行。常用选项:
-i 忽略大小写
-c 在行的开头输出该行出现的次数
-d 只输出重复的行
-u 只输出出现过一次的行
示例1:输出每个账号的登录次数
root@~$ last | cut -d ' ' -f1 | sort | uniq -c
1
18 hadoop
18 reboot
33 root
1 wtmp
示例2:接上例,分别输出只登录过一次的,和多于一次的
root@~$ last | cut -d ' ' -f1 | sort | uniq -cu
1
1 wtmp
root@~$ last | cut -d ' ' -f1 | sort | uniq -cd
18 hadoop
18 reboot
33 root