shell笔记(一)-管道命令

本文编写于4072天前,最后编辑于 4071天前,部分内容可能已经过时,请您自行斟酌确认。

1.|:仅处理经由前面一个命令传来的的正确信息.管道后面的命令必须能够接受standard input的数据,这样的命令才是管道命令.
2.cut:将一段信息的某一段切出来,处理信息的单位是以行为单位.主要用途是将同一行里面的数据进行分解.

范例
echo $PATH | cut -d ':' -f 5
-d: 后接分隔字符
-f:分割后取第几段

export | cut -c 12-
取没一行的第12个字符后的信息

3.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
# 神奇的是,如果加上 --color=auto 的选项,找到的关键字部分会用特殊颜色显示喔!

4.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
# 鸟哥省略很多的输出~由上面的资料看起来, sort 是预设‘以第一个’资料来排序,
# 而且预设是以‘文字’型态来排序的喔!所以由 a 开始排到最后啰!

范例二:/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
# 看到特殊字体的输出部分了吧?怎么会这样排列啊?呵呵!没错啦~
# 如果是以文字型态来排序的话,原本就会是这样,想要使用数字排序:
# cat /etc/passwd | sort -t ':' -k 3 -n
# 这样才行啊!用那个 -n 来告知 sort 以数字来排序啊!

范例三:利用 last ,将输出的资料仅取帐号,并加以排序
[root@www ~]# last | cut -d ' ' -f1 | sort

5.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
# 从上面的结果可以发现 reboot 有 12 次, root 登入则有 41 次!
# wtmp 与第一行的空白都是 last 的预设字元,那两个可以忽略的!

6.wc:可以帮我们计算输出的讯息的整体资料

[root@www ~]# wc [-lwm]
选项与参数:
-l  :仅列出行;
-w  :仅列出多少字(英文单字);
-m  :多少字元;

范例一:那个 /etc/man.config 里面到底有多少相关字、行、字元数?

[root@www ~]# cat /etc/man.config | wc 
    141     722    4617
# 输出的三个数字中,分别代表: ‘行、字数、字元数’

范例二:我知道使用 last 可以输出登入者,但是 last 最后两行并非帐号内容,
        那么请问,我该如何以一行指令串取得这个月份登入系统的总人次?
[root@www ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l 
# 由于 last 会输出空白行与 wtmp 字样在最底下两行,因此,我利用
# grep 取出非空白行,以及去除 wtmp 那一行,在计算行数,就能够了解啰!

7.tee:双重重定向,即把信息输出到屏幕上同时也保存到文件里,参数-a是累加到某一文件里

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注