## 程序运行环境输入与输出
-
标准输入 0
-
read a;echo $a
-
标准输出 1
-
echo ceshiren.com
-
错误输出
-
ls not_exist_dir
scale 1000 width
[jck287213@shell.ceshiren.com ~]$ read a;
1
[jck287213@shell.ceshiren.com ~]$ echo $a
1
[标准输入0] → [程序]
[程序] → [标准输出1]
[程序] -down-> [错误输出2]
## 管道重定向
-
管道与管道之间可以重定向
-
管道与文件之间可以重定向
echo 11 > /tmp/1
read var </tmp/1
echo $var
ls not_exist_dir > /tmp/output
ls not_exist_dir > /tmp/output 2>&1
## 管道连接
scale 1000 width
[标准输入0] as 1.0
[标准输出1] as 1.1
[错误输出2] as 1.2
[标准输入0] as 2.0
[标准输出1] as 2.1
[错误输出2] as 2.2
1.0 → [程序1]
[程序1] → 1.1
[程序1] -down-> 1.2
1.1 → 2.0
2.0 → [程序2]
[程序2] → 2.1
[程序2] -down-> 2.2
[jck287213@shell.ceshiren.com tmp]$ echo 111 >/tmp/2
[jck287213@shell.ceshiren.com tmp]$ cat 2
111
[jck287213@shell.ceshiren.com tmp]$ is not_exist_dir > /tmp/output
-bash: is: command not found
[jck287213@shell.ceshiren.com tmp]$ is not_exist_dir > /tmp/output 2>&1
[jck287213@shell.ceshiren.com tmp]$ cat 2
111
[jck287213@shell.ceshiren.com tmp]$ cat /tmm/output
cat: /tmm/output: No such file or directory
## 管道连接符 |
-
管道连接符
|
可以连接多个程序的执行 -
管道连接是以子进程的方式启动的
echo hogwarts | { read line; echo input is $line; }
[jck287213@shell.ceshiren.com tmp]$ echo hagwarts |{ read line; echo input is $line; }
input is hagwarts
curl https://ceshiren.com/categories.json \
| grep -o ‘{"id[^}]*}’ \(获取包含id以}开头的任意字符的内容)
| awk -F, ‘{print $2,$6}’ \(以,为分隔符打印2,6字段的数据)
| awk -F ‘"’ ‘{print $7,$4}’ \(以”为分隔符打印7,4字段的数据)
| sed ‘s#:##’ \ (匹配:分割的全部)
| sort -nr \(按数字从小到大排序)
| head -5
[jck287213@shell.ceshiren.com tmp]$ curl https://ceshiren.com/categories.json \
| grep -o ‘{"id[^}]*}’ \
| awk -F, ‘{print $2,$6}’ \
| awk -F ‘"’ ‘{print $7,$4}’ \
| sed ‘s#:##’ \
| sort -nr \
| head -5
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 22074 0 22074 0 0 64204 0 --:–:-- --:–:-- --:–:-- 64168
1771 霍格沃兹答疑区
997 职位内推
930 提问区
918 学习笔记
535 开源项目
## 管道执行的上下文控制
-
使用 { command; } 注意花括号与内部命令之间的空格与分号
-
使用控制逻辑 while read 组合
-
使用 $() ``
#这个方式无法获得变量x
echo hello world | read x; echo $x
#如下两个方式可以获得变量x
echo hello world | { read x; echo $x; }
echo hello world | while read x; do echo $x; done
[jck287213@shell.ceshiren.com ~]$ echo hello word | read x;echo $x
[jck287213@shell.ceshiren.com ~]$ echo hello word | { read x;echo $x; }
hello word
[jck287213@shell.ceshiren.com ~]$ echo hello world | while read x; do echo $x; done
hello world
Linux 三剑客
grep awk sed
## Linux 三剑客介绍
grep
global search regular expression(RE) and print out the line 基于正则表达式查找满足条件的行
awk
名字来源于三个作者的名字简称
根据定位到的数据行处理其中的分段
sed
stream editor
根据定位到的数据行修改数据
## 与 SQL 的对比
|Linux 三剑客|SQL Structured Query Language|
|—|—|
|grep 数据查找定位|select * from table like ‘%xx’|
|awk 数据切片|select field from table|
|sed 数据修改|update table set field=new where field=old|
## 平台实现差异与官方文档
-
mac 上的实现与 gnu 的实现有差异
-
不同版本之间有小的语法差异
-
可以通过独立下载 gawk 等工具实现
## 官方文档
## BRE 基本正则表达式
-
^ 开头 $结尾
-
[a-z]
[0-9]
区间,如果开头带有^表示不能匹配区间内的元素 -
*
0 个或多个 -
.
表示任意字符
## ERE 扩展正则表达式
-
基本正则表达式(BRE)基础上的扩展
-
?
非贪婪匹配 -
+
一个或者多个 -
()
分组 -
{}
范围约束 -
|
匹配多个表达式的任何一个
[jck287213@shell.ceshiren.com ~]$ echo 123 | grep -E “1|3”
123
[jck287213@shell.ceshiren.com ~]$ echo 123 | sed -E -e “s#1|3#x#g”
x2x
[jck287213@shell.ceshiren.com ~]$ echo 123 | awk “/4|3/”
123