目录
- 1 管道
- 1.1 管道
- 1.2 cat和more命令
- 1.3 sed命令与管道
- 1.4 awk命令与管道
- 2 I/O重定向
- 2.1 文件标识符(FD)
- 2.2 I/O重定向符号及其用法
- 2.3 exec命令的用法
- 2.4 I/O重定向符号及其意义
- 3 命令行处理
- 3.1 命令行处理流程
- 3.2 eval命令
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具有特殊意义的符号,必须直接出现在命令行中