【linux学习笔记】命令执行判断依据(';'、'&&'、'||')管线命令('|')以及cut、grep命令

欢迎转载,转载请注明原地址:
http://blog.csdn.net/u013190088/article/details/65445500


命令执行判断依据(’;’、’&&’、’||’)

如果我们想要一次输入去执行很多指令,而不想分次执行时,一般有两个选择:
①shell script撰写脚本去执行
②透过【;】、【&&】、【||】


1、 cmd;cmd(不考虑指令相关性的连续指令下达)
有些时候,我们希望可以一次执行多条指令,比如在关机的时候可以先执行两次sync同步化写入磁盘后才shutdown计算机,那么我们可以这么写:

sync;sync;shutdown -h now

在指令中间利用【;】隔开,这样一来,分号前的指令执行完毕之后就会立即执行后边的指令。可是呢…..
如果我们想要在某一个目录下面建立一个档案,也就是说目录存在的话就建立这个档案,如果目录不存在,那就算了。也就是说这两个指令彼此之间是有相关性的,前一个指令是否成功的执行与后一个指令是否执行有关,那就得用到【&&】和【||】了。
2、&&、||
如果两个指令之间有相依性(所谓的相依性指的就是前一个指令执行的结果是否正确),那么我们就需要用到【&&】和【||】。
&&和||用法
例子:
我不清楚/tmp/abc是否存在,可就是要建立/tmp/abc/hehe这个档案。

ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe

上面这个例子总是会创建/tmp/abc/hehe档案的,不论/tmp/abc存不存在。

在一个例子:
用ls测试/tmp/hehe是否存在,如果存在现实“exist”,不存在显示“not exist”

ls /tmp/hehe && echo "exist" || echo "not exist"

指令是一个接着一个去执行的,因此如果真要使用判断,那么这个&&与||的顺序不能搞错,一般来说,假设判断式有三个,也就是:

cmd1 && cmd2 || cmd3

而且顺序通常不会变。


管线命令(pipe)

管线命令【|】可以处理经由前一个指令传来的正确信息,也就是stdout的信息。(去了解stdout)而对于stderr没有直接处理的能力。那么整体的管线命令可以使用下图表示:
这里写图片描述

在每个管线后面接的第一个数据必定是【指令】!!而且这个指令必须能接受standard input的数据才行,这样的指令才可以是【管线命令】。例如less、more、head、tail等都是可以接受standard input的管线命令。例如ls、cp、mv等就不是管线命令。
例子:

[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ ls -al /etc/ | less

total 1264
drwxr-xr-x. 71 root root   4096 Mar 18 14:27 .
dr-xr-xr-x. 22 root root   4096 Mar 17 15:02 ..
-rw-r--r--.  1 root root     46 Feb 23 07:39 adjtime
-rw-r--r--.  1 root root   1512 Jan 12  2010 aliases
-rw-r--r--   1 root root  12288 Feb 23 07:33 aliases.db
......省略

【撷取命令】 cut,grep

撷取命令就是将一段数据经过分析后,取出我们所想要的,或者经由分析关键词,取得我们所想要的那一行。不过,需要注意的是,撷取命令通常是针对【一行一行】来分析的,并不是整篇分析的。
1、cut
用法:

cut -d '分隔字符' -f fields  <==用于有特定分隔字符
cut -c 字符区间

-d:后面接分隔字符。与-f一起用
-f:根据-d的分隔字符将一段讯息分割成为数段,用-f取出第几段的意思
-c:以字符(characters)的单位取出固定字符区间

范例1(将PATH变量取出,找出第三个路径):

[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/lovebell/bin

[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ echo $PATH | cut -d ':' -f 3
/usr/bin
PATH以【:】作为分隔,因此会出现/usr/bin
如果要是列出第三个与第五个呢?
[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ echo $PATH | cut -d ':' -f 3,5
/usr/bin:/usr/sbin

范例2(将export输出的信息,取得第十二个字符之后的所有字符串)

[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ export  
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTCONTROL="ignoredups"
...省略
<==每个数据都是排列整齐的输出,如果我们不想要【declare -x】时这么写即可:
[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ export | cut -c 12-
CVS_RSH="ssh"
G_BROKEN_FILENAMES="1"
HISTCONTROL="ignoredups"
...省略
我们还可以指定某个范围的值,例如第12-20的字符,就是cut -c 12-20

cut主要的用途在于将【同一行里面的数据进行分解!】最常使用在分析一些数据或文字数据的时候!这是因为有时候我们会以某些字符当做分割的参数,然后来讲数据加以切割,以取得我们所需要的数据。

2、grep
刚刚的cut是将一行的讯息当中,取出某部门我们想要的,而grep则是分析一行讯息,若当中有我们所需要的信息,就将该行拿出来。
用法:

grep [-acinv] [--color=auto] 'str' filename

-a:将binary档案以text档案的方式搜寻数据
-c:计算找到'str'的次数
-i:忽略大小写
-n:输出行号
-v:反向选择,也就是显示出没有'str'内容的那一行
--color=auto:可以将找到的关键词部分加上颜色

范例1:(last可以输出登入者信息。【账号/终端机/来源/日期时间】)将出现root的行取出来

[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ last | grep 'root'
root     pts/1        192.168.95.246   Fri Mar 17 15:07 - 15:07  (00:00)    
root     pts/0        192.168.95.246   Fri Mar 17 15:03 - 15:07  (00:04) 

范例2:在last的输出讯息中,只要有root就取出,并且仅取第一栏

[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ last | grep 'root' | cut -d ' ' -f 1
root
root

范例4:取出/etc/man.config 内还有MANPATH的那几行

[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ grep --color=auto 'MANPATH' /etc/man.config
加上--color=auto的选项,找到的关键字会用特殊颜色显示。

grep也可以配合正则表达式使用,能够处理的数据就更多了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值