小技巧:Linux实用命令之cut, sort, uniq

1. cut

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

2. sort

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

3.uniq

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

你可能感兴趣的:(小技巧)