jck28-lucio-Linux 三剑客与管道使用

## 程序运行环境输入与输出

  • 标准输入 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