1 管道
1.1 管道
-
定义
管道技术是linux的一种基本的进程间通信技术,利用先进先出排队模型来指挥进程间的通信,可以把它当做是连接两个实体的一个单向连接器。
-
作用范围
Linux管道可用于应用程序之间、linux命令之间(例如:shell编程),以及应用程序和linux命令之间的通信
-
语法
command1 | command2 | command3 | ... | commandn
- shell编程中管道符号是竖杠符号"|"
- 当shell遇到管道符"|"后,前一个command(n-1)的输出发送给command(n),作为command(n)的输入
1.2 cat和more命令
-
语法
cat [option] fileName more [option] [+linenum] fileNames
-
说明
- option指选项
- filename指文件名
- more命令中+linenum可以指定显示文件的起始行
- cat命令在显示文件时不提供分页功能,而more命令在显示超过一页的文件时提供了分页功能
-
cat命令的选项名称及其意义
选项 意义 -a 显示文件的所有内容 -b 由1开始对所有输出的行数编号,但对空白行不编号 -E 每一行末显示"$" -n 由1开始对所有输出的行数编号 -s 当遇到有连续两行以上的空白行,就替换为一行空白行 -v 不可显示的字符(制表符、新行符和换页符除外)以可见的形式显示 -
more命令的选项名称及其意义
选项 意义 -num 一次显示的行数 -d 提示使用者,在画面下方显示"Press space to continue,q to quit.",如果使用者按错键,则会显示“Press h for instructions” -l 取消遇到特殊字元 ^L(送纸字元)时会暂停的功能 -f 计算行数时,以实际的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上) -p 不以卷动的方式显示每一页,而是先清除屏幕后再显示内容 -c 跟-p相似,不同的是先显示内容,再清除其他旧资料 -s 当遇到有连续两行以上的空白行,就替换为一行的空白行 -u 禁止显示强调符,即不显示下划线 +/ 在每个文件显示前搜寻该字串(pattern),然后从该字串之后开始显示 +num 从第num行开始显示
1.3 sed命令与管道
-
语法
| sed [选项] 'sed命令' #sed在管道符"|"之后出现,表示sed命令对管道输入的数据进行处理
-
示例
variable1="Yahoo develops MapReduce Framework" variable2="Google" echo variable1 echo variable1 | sed 's/Yahoo/${variable2}/g'
1.4 awk命令与管道
-
语法
| awk [-F域分隔符] 'awk程序段'
几乎所有可以用expr命令的字符串处理功能都可以用awk代替实现
-
示例
string='Speeding up small jobs in Hadoop' echo $string | awk '{print substr($string,25)}'
awk -F ':' '{print '$1' | "sort"}' /etc/passwd # 特别注意的是,awk中调用linux命令需要用双引号将这些命令引起来
awk 'BEGIN{while (("ls /usr" | getline d)>0) print d}' #当我们要用awk处理shell命令的输出时,需要引入getline函数将shell命令的输出保存到变量中,awk再对该变量进行处理
2 I/O重定向
-
定义
I/O重定向是一个过程,这个过程捕捉一个文件、命令、程序或脚本,甚至代码块的输出,然后把捕捉到的输出作为输入发送给另外一个文件、命令、程序或脚本。
2.1 文件标识符(FD)
-
定义
文件标识符是从0开始到9结束的整数,指明了与进程相关的特定数据流的源。
-
说明
-
当Linux系统启动一个进程(该进程可能用于执行shell命令)时,将自动为该进程打开三个文件:标准输入、标准输出和标准错误输出
-
标准输入stdin、标准输出stdout和标准错误stderr输出,分别由文件标识符0,1,2标识
-
该进程如果要打开其他的输入或输出文件,则从整数3开始标识
-
shell命令从标准输入读取输入数据,将输出送到标准输出,如果该命令再执行过程中发生了错误,则将错误信息输出到标准错误输出。
-
如果需要将Shell命令的输出从标准输出复制一份到某个文件中,可以使用tee命令.
who | tee output # tee命令产生的数据流向很像英文字母T,将一个输出分为两个支流,一个到标准输出,另一个到某输出文件 # tee的-a选项,表示将shell命令的输出追加到某个文件的末尾 ps | tee -a output
-
2.2 I/O重定向符号及其用法
-
cat和>符号结合使用成为简易文本编辑器
cat > filename # 1.cat命令后不加任何参数时,cat命令的输入是标准输入,即键盘输入 # 2.I/O重定向符号">"将键盘输入写入文件 # 3."Ctrl+D"组合键结束编辑
-
">>>"和">"符号
- ">>"符号将标准输出追加到已有文件的内容之后
- ">"符号将文件的原有文件覆盖,然后写入标准输出的内容
-
">|"符号
- ">|"符号是强制覆盖文件的符号
- ">|"与shell的noclobber选项有关,如果noclobber选项开启,表示不允许覆盖任何文件,而">|"符号则可以不管noclobber选项的作用,强制将文件覆盖
-
"n>>filename"、"n>|filename"、"n>filename"
表示将FD为n的文件重定向到filename文件之中,三者的区别实际上是>>、>|和>这三个符号的区别
-
"<"符号
"<"是I/O重定向的输入符号,它可将文件内容写到标准输入之中
-
"<<delimiter"符号
"<<delimiter"符号称为此处文档(Here-document),delimiter称为分界符,该符号表明:shell将分界符delimiter之后直至下一个delimiter之前的所有内容作为输入。
# 与cat > filename 结合使用 cat >file1 <<CLOUD Hadoop is developed by Yahoo Google alse develops GFS and MapReduce CLOUD
"-<<delimiter",即在"<<"符号前加上"-",这样输入文本行所有开头的"Tab"键都会被删除,但是,开头的空格键却不会被删除。
2.3 exec命令的用法
-
定义
exec命令可以通过文件标识符打开或关闭文件,也可将文件重定向到标准输入,及将标准输出重定向到文件
-
说明
"&>file"可以同时将标准输出和标准错误输出重定向到文件
2.4 I/O重定向符号及其意义
-
基本I/O重定向符号及其意义
符号 意义 cmd1 | cmd2 管道符,将cmd1的标准输出作为cmd2的标准输入 >filename 将标准输出写到文件filename之中 <filename 将文件filename的内容读入到标准输入之中 >>filename 将标准输出写到文件filename之中,若filename文件已存在,则将标准输出追加到filename已有内容之后 >|filename 即使noclobber选项已开启,仍然强制将标准输出写到文件filename之中,即将filename文件覆盖掉 n>|filename 即使noclobber选项已开启,仍然强制将FD为n的输出写到文件filename之中,即将filename文件覆盖掉 n>filename 将FD为n的输出写到文件filename之中 n<filename 将文件filename的内容读入到FD为n的输入之中 n>>filename 将FD为n的输出写到文件filename之中,若filename文件已存在,则将FD为n的输出追加到filename已有内容之后 <<delimiter 此处文档(Here-document) -
高级I/O重定向符号及其意义
-
说明:需要结合'exec'命令使用
-
示例
exec 8<&0 # 将FD为0的输入复制到FD为8的文件 exec 8<&- # 关闭FD 8,其他进程可以重复使用FD 8
符号 意义 n>&m 将FD为m的输出复制到FD为n的文件 n<&m 将FD为m的输入复制到FD为n的文件 n>&- 关闭FD为n的输出 n<&- 关闭FD为n的输入 &>file 将标准输出和标准错误输出重定向到文件 -
3 命令行处理
3.1 命令行处理流程
-
定义
-
shell从标准输入或脚本读取的每一行称为管道(pipeline),每一行包含一个或多个命令,这些命令用管道符隔开,shell对每一个读取的管道按照流程进程处理
-
流程图
- 说明
- 令牌可以是关键字、单词、也可以是I/O重定向器和分号
- 令牌之间以元字符分隔
- shell的元字符集合是固定不变的,包括空格、Tab键、换行字符、分号(;)、圆括号、输入重定向符(<)、输出重定向符(>)、管道符(|)和 '&' 符号
3.2 eval命令
-
定义
eval命令将其参数作为命令行,让shell重新执行该命令
-
示例
pipe='|' eval ll $pipe wc -l
-
说明
- 命令结束符(;,|,&)、I/O重定向符(<,>)和引号这些对shell具有特殊意义的符号,必须直接出现在命令行中