高效率的使用Linux通常都需要结合命令的顺序控制以及管道一起实现。这里主要总结一下Linux命令的执行顺序控制和管道的使用方法。
命令执行顺序控制
1.顺序执行多个命令
通过;
把多个命令放在一起,可以达到顺序执行这几个命令的效果。
2.有选择执行命令
顺序执行命令存在的弊端显而易见,如果我们需要在前面命令执行成功(或者满足一定条件时)才执行后续的命令,我们就需要学会控制命令执行与否。
&&
符号表示左侧命令执行返回0时,执行右侧命令;||
表示左侧命令执行返回1时,执行右侧命令(注意:与java等代码中对应符号逻辑相反)。
shiyanlou:~/ $ which cowsay [17:35:25]
cowsay not found
shiyanlou:~/ $ echo $?[17:51:13]
1
shiyanlou:~/ $ which cowsay && echo 2[17:51:26]
cowsay not found
shiyanlou:~/ $ which cowsay>/dev/null&& echo 2 [17:51:57]
shiyanlou:~/ $ sudo apt-get update;sudo apt-get install cowsay
shiyanlou:~/ $ which cowsay [17:57:06]
/usr/games/cowsay
shiyanlou:~/ $ echo $?[17:57:21]
0
shiyanlou:~/ $ which cowsay && echo 2[17:57:29]
/usr/games/cowsay
2
shiyanlou:~/ $ which cowsay>/dev/null && echo 2[17:57:35]
2
由上述代码知,
- 命令执行返回和命令执行的打印内容不是一个概念;
-
echo $?
表示打印前一个命令执行的返回值; -
>\dev\null
表示把命令执行中打印的内容抛进‘地狱’(/dev/null就是个地狱一般的无底洞);
下图可以形象的描述这个过程:
管道的使用
管道是一种通信机制,通常用于进程间的通信。它表现出来的形式就是把前面进程的输出(stdout)直接作为下个进程的输入(stdin)。
管道通常分为匿名管道和具名管道。我们在使用一些过滤程序时,经常会用到匿名管道,在命令行中由|
分隔符表示。具名管道简单说就是有名字的管道,通常只会在源程序中用到具名管道。这里我们主要介绍匿名管道的常见用法。
-
less命令
shiyanlou:~/ $ ll /etc | less [19:04:33]
total 816K
drwxr-xr-x 2 root root 4.0K Aug 17 12:41 ImageMagick
drwxr-xr-x 2 root root 4.0K Aug 17 12:44 R
drwxr-xr-x 10 root root 4.0K Aug 17 12:44 X11
-rw-r--r-- 1 root root 3.0K May 29 2015 adduser.conf
drwxr-xr-x 2 root root 12K Aug 18 18:04 alternatives
drwxr-xr-x 8 root root 4.0K Aug 17 12:43 apache2
drwxr-xr-x 3 root root 4.0K May 29 2015 apparmor
drwxr-xr-x 6 root root 4.0K Aug 17 12:44 apparmor.d
drwxr-xr-x 4 root root 4.0K Aug 17 12:39 apport
drwxr-xr-x 6 root root 4.0K Aug 18 17:52 apt
drwxr-xr-x 3 root root 4.0K Aug 17 12:44 authbind
-rw-r--r-- 1 root root 2.2K Apr 9 2014 bash.bashrc
-rw-r--r-- 1 root root 45 Mar 23 2014 bash_completion
drwxr-xr-x 2 root root 4.0K Aug 17 12:44 bash_completion.d
-rw-r--r-- 1 root root 356 Jan 2 2012 bindresvport.blacklist
-rw-r--r-- 1 root root 321 Apr 17 2014 blkid.conf
lrwxrwxrwx 1 root root 15 Sep 3 2015 blkid.tab -> /dev/.blkid.tab
drwxr-xr-x 3 root root 4.0K Aug 17 12:37 ca-certificates
-rw-r--r-- 1 root root 7.7K Aug 17 12:42 ca-certificates.conf
drwxr-xr-x 2 root root 4.0K Aug 17 12:41 calendar
drwxr-xr-x 2 root root 4.0K May 29 2015 console-setup
drwxr-xr-x 2 root root 4.0K Aug 17 12:44 cron.d
drwxr-xr-x 2 root root 4.0K Aug 17 12:44 cron.daily
drwxr-xr-x 2 root root 4.0K May 29 2015 cron.hourly
drwxr-xr-x 2 root root 4.0K May 29 2015 cron.monthly
drwxr-xr-x 2 root root 4.0K Aug 17 12:41 cron.weekly
-rw-r--r-- 1 root root 722 Feb 9 2013 crontab
:
-
cut命令
/etc/passwd
文件中字段之间由:
隔离,每个字段代表不同的意思(具体参见Linux中/etc/passwd文件详解),如果我们只要查看用户名和用户的home目录,则可以用cut
命令实现:
shiyanlou:~/ $ grep "shiyanlou" /etc/passwd | cut -d ':' -f 1,6 [19:25:24]
shiyanlou:/home/shiyanlou
cut
更多用法如下:
shiyanlou:~/ $ grep "shiyanlou" /etc/passwd | cut -c -5 #取前5个字符(包含第5个)
shiyanlou:~/ $ grep "shiyanlou" /etc/passwd | cut -c 2-5 #取2~5个字符(包含第5个)
shiyanlou:~/ $ grep "shiyanlou" /etc/passwd | cut -c 5- #取后5个字符(包含第5个)
shiyanlou:~/ $ grep "shiyanlou" /etc/passwd | cut -c 5 #取前第五个字符
-
grep命令
grep
是个很强大的命令, 主要完成从文本或stdin
中查找匹配字符串,它还可以结合正则表达式实现很复杂却很高效的匹配和查找。
grep
格式一般为:
grep -rnI "eldonzhao" ~
其中-r
表示递归查找,-n
表示显示行号,-I
表示忽略大小写
shiyanlou:~/ $ export | grep -nI "shiyan$" [19:28:34]
shiyanlou:~/ $ export | grep -nI "yanlou$" [19:52:25]
1:HOME=/home/shiyanlou
5:LOGNAME=shiyanlou
8:MAIL=/var/mail/shiyanlou
17:USER=shiyanlou
-
wc命令
wc
是个非常简单小巧的计数工具。
shiyanlou:~/ $ wc /etc/passwd [19:56:34]
28 35 1370 /etc/passwd
shiyanlou:~/ $ wc -l /etc/passwd [19:59:02]
28 /etc/passwd #行数
shiyanlou:~/ $ wc -w /etc/passwd [19:59:07]
35 /etc/passwd #单词书
shiyanlou:~/ $ wc -c /etc/passwd [19:59:12]
1370 /etc/passwd #字节数
shiyanlou:~/ $ wc -m /etc/passwd [19:59:21]
1370 /etc/passwd #字符数
shiyanlou:~/ $ wc -L /etc/passwd [19:59:27]
81 /etc/passwd #最长行字节数
shiyanlou:~/ $ ls -d /etc/*/ | wc -l[20:02:20]
103 #etc下所有目录数
-
sort命令
该命令的功能就是将输入按照一定方式排序,然后再输出。它支持的排序方式有:字典排序、数字排序、按月份排序、随机排序、反转排序、指定字符串排序等。
- 默认排序(字典排序)
shiyanlou:~/ $ cat /etc/passwd | sort [16:33:30]
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
games:x:5:60:games:/usr/games:/usr/sbin/nologin
- 反转排序
shiyanlou:~/ $ cat /etc/passwd | sort -r [16:33:34]
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
tomcat7:x:108:112::/usr/share/tomcat7:/bin/false
syslog:x:101:104::/home/syslog:/bin/false
- 按特定字段排序
shiyanlou:~/ $ cat /etc/passwd | sort -t ":" -k 3 -n [16:41:56]
root:x:0:0:root:/root:/bin/bash
libuuid:x:100:101::/var/lib/libuuid:
上述命令表示要排序/etc/passwd中内容,排序字段为每行按:
分割后的第三个字段。-t ':'
表示按:
分割,-k 3
表示按照第三个字段排序,-n
表示按照数字顺序排序。
-
uniq命令
uniq
命令是用于去除连续重复行的。
shiyanlou:~/ $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq #去掉重复的行
cat
history
history|
sort
uniq
shiyanlou:~/ $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D #打印所有重复的行
cat
cat
cat
cat
cat
cat
history
history
shiyanlou:~/ $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -d #打印重复的行
cat
history
history|
sort
shiyanlou:~/ $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc #打印重复的行和重复次数
6 cat
7 history
4 history|
2 sort