每天学点Linux-选取命令CUT和GREP
选取命令就是将一段数据经过分析后,取出我们所想要的。或者是经由分析关键词,取得我们所想要的那一行!一般来说,选取命令通常是针对一行一行的数据来进行分析的, 并不是整篇信息分析。
cut
cut命令可以将一段信息的某一段选取出来,信息处理一行为单位。CUT命令使用格式如下:
[root@www ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符 [root@www ~]# cut -c 字符区间 <==用于排列整齐的信息 选项与参数: -d :后面接分隔字符。与 -f 一起使用; -f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思; -c :以字符 (characters) 的单位取出固定字符区间;
范例一:将 PATH 变量取出,我要找出第五个路径。
[root@www ~]# echo $PATH | cut -d ':' -f 5 # 如同上面的数字显示,我们是以『 : 』作为分隔,因此会出现 /usr/local/bin # 那么如果想要列出第 3 与第 5 呢?,就是这样: [root@www ~]# echo $PATH | cut -d ':' -f 3,5
范例二:将 export 输出的信息,取得第 12 字符以后的所有字符串
[root@www ~]# export declare -x HISTSIZE="1000" declare -x INPUTRC="/etc/inputrc" declare -x KDEDIR="/usr" declare -x LANG="zh_TW.big5" .....(其他省略)..... # 注意看,每个数据都是排列整齐的输出!如果我们不想要『 declare -x 』时, # 就得这么做: [root@www ~]# export | cut -c 12- HISTSIZE="1000" INPUTRC="/etc/inputrc" KDEDIR="/usr" LANG="zh_TW.big5"
CUT -d命令适合操作具有固定分割符的文本,用 -c 可以处理比较具有格式的输出数据,还可以指定某个范围的值,例如第 12-20 的字符,就是 cut -c 12-20。cut 主要的用途在于将『同一行里面的数据进行分解!』最常使用在分析一些数据或文字数据的时候! 这是因为有时候我们会以某些字符当作分割的参数,然后来将数据加以切割,以取得我们所需要的数据。 鸟哥也很常使用这个功能呢!尤其是在分析 log 文件的时候!不过,cut 在处理多空格相连的数据时,可能会比较吃力一点。
grep
cut是将一行信息当中,取出某部分我们想要的,而grep则是分析一行信息, 若当中有我们所需要的信息,就将该行拿出来。其使用方法如下:
[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename 选项与参数: -a :将 binary 文件以 text 文件的方式搜寻数据 -c :计算找到 '搜寻字符串' 的次数 -i :忽略大小写的不同,所以大小写视为相同 -n :顺便输出行号 -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行! --color=auto :可以将找到的关键词部分加上颜色的显示喔!
具体的操作实例如下:
范例一:将 last 当中,有出现 root 的那一行就取出来; [root@www ~]# last | grep 'root' 范例二:与范例一相反,只要没有 root 的就取出! [root@www ~]# last | grep -v 'root' 范例三:在 last 的输出信息中,只要有 root 就取出,并且仅取第一栏 [root@www ~]# last | grep 'root' |cut -d ' ' -f1 # 在取出 root 之后,利用上个命令 cut 的处理,就能够仅取得第一栏啰! 范例四:取出 /etc/man.config 内含 MANPATH 的那几行 [root@www ~]# grep --color=auto 'MANPATH' /etc/man.config ....(前面省略).... MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man MANPATH_MAP /usr/bin/X11 /usr/X11R6/man MANPATH_MAP /usr/bin/mh /usr/share/man
排序命令: sort, wc, uniq
sort命令可以进行排序,而且可以依据不同的数据型态来排序,排序的字符与语系的编码有关。
[root@www ~]# sort [-fbMnrtuk] [file or stdin] 选项与参数: -f :忽略大小写的差异,例如 A 与 a 视为编码相同; -b :忽略最前面的空格符部分; -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法; -n :使用『纯数字』进行排序(默认是以文字型态来排序的); -r :反向排序; -u :就是 uniq ,相同的数据中,仅出现一行代表; -t :分隔符,默认是用 [tab] 键来分隔; -k :以那个区间 (field) 来进行排序的意思
范例一:个人账号都记录在 /etc/passwd 下,请将账号进行排序。
[root@www ~]# cat /etc/passwd | sort adm:x:3:4:adm:/var/adm:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
范例二:/etc/passwd 内容是以 : 来分隔的,我想以第三栏来排序,该如何?
[root@www ~]# cat /etc/passwd | sort -t ':' -k 3 root:x:0:0:root:/root:/bin/bash uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin
看到特殊字体的输出部分了吧?怎么会这样排列啊?如果是以文字型态来排序的话,原本就会是这样,想要使用数字排序,使用-n来以数字来排序。
# cat /etc/passwd | sort -t ':' -k 3 -n
uniq
uniq命令可以用来去除重复的数据,仅仅保留一行,其使用方法如下:
[root@www ~]# uniq [-ic] 选项与参数: -i :忽略大小写字符的不同; -c :进行计数
范例一:使用 last 将账号列出,仅取出账号栏,进行排序后仅取出一位;
[root@www ~]# last | cut -d ' ' -f1 | sort | uniq
范例二:承上题,如果我还想要知道每个人的登陆总次数呢?
[root@www ~]# last | cut -d ' ' -f1 | sort | uniq -c 1 12 reboot 41 root 1 wtmp
UNIQ这个命令用来将重复的行删除掉只显示一个,举个例子来说, 你要知道这个月份登陆你主机的用户有谁,而不在乎他的登陆次数,那么就使用上面的范例, (1)先将所有的数据列出;(2)再将人名独立出来;(3)经过排序;(4)只显示一个! 由于这个命令是在将重复的东西减少,所以当然需要『配合排序过的文件』来处理啰!
wc
如果想要知道文件里面有多少字?多少行?多少字符的话可以利用 wc 这个命令来达成,WC可以帮我们计算输出的信息的整体数据。其使用方法如下:
[root@www ~]# wc [-lwm] 选项与参数: -l :仅列出行; -w :仅列出多少字(英文单字); -m :多少字符;
范例一:那个 /etc/man.config 里面到底有多少相关字、行、字符数?
[root@www ~]# cat /etc/man.config | wc 141 722 4617
输出的三个数字中,分别代表: 行、字数、字符数