Linux三剑客与管道使用
Linux 三剑客与管道使用
简介
在 Linux 中,数据处理的效率和灵活性至关重要。grep
、awk
和sed
被称为 Linux三剑客
,是处理文本文件的利器。分别用于查找、切片和修改数据,通过管道连接可以组合使用,完成复杂的数据处理任务。
程序运行环境输入与输出
在 Linux 中,程序通常有三个标准的输入输出流:
- 标准输入(stdin):文件描述符为 0
- 标准输出(stdout):文件描述符为 1
- 标准错误(stderr):文件描述符为 2
标准输入 0
标准输入是程序默认从键盘读取输入的地方,可以使用以下命令读取用户输入并回显。
read a
echo $a
标准输出 1
标准输出是程序默认输出信息到屏幕的地方。
echo ceshiren.com
错误输出 2
标准错误输出用于显示错误信息。
is not_exist_dir
管道
管道可以将一个命令的输出作为另一个命令的输入
(重点)管道连接符 |
管道连接符 |
用于连接多个命令,使一个命令的输出成为下一个命令的输入,管道连接是以子进程的方式启动的。例如:
echo hogwarts | { read line; echo input is $line; }
echo hogwarts
:这个命令将字符串hogwarts
输出到标准输出(stdout)。|
(管道符):将echo hogwarts
的输出被传递给{}
内的命令。read line
:read
命令从标准输入(stdin)读取一行,并将其赋值给变量line
。在这里line
的值是hogwarts
。echo input is $line
:其中$line
将被替换为变量line
的位置。
实例
抓取并处理网络数据
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
管道重定向
在 Linux 中,重定向和管道是非常强大的工具,允许你将命令的输出重定向到文件,或者从文件读取输入,还可以将错误输出重定向。这些技术帮助我们在处理数据和命令时更加灵活和高效。
管道与文件之间的重定向
将输出重定向到文件:
echo 11 > /tmp/1
结果:文件 /tmp/1
的内容是11
。
echo 11
:将字符串 11 输出到标准输出 (stdout)。>
:重定向符号>
将标准输出重定向到文件,如果文件存在将会被覆盖,不存在则会创建一个新的文件。
从文件读取输入:
read var </tmp/1
结果:变量 var
的值将是文件 /tmp/1
的内容,即 11
。
read var
:read
命令从标准输入 (stdin) 读取一行,并将其赋值给变量var
。<
:重定向符号,将文件/tmp/1
作业标准输入。
错误输出重定向
将错误输出重定向到文件:
ls not_exist_dir > /tmp/output
结果:由于not_exist_dir
不存在,/tmp/output
文件会是空的,错误信息仍然显示在终端上。
ls not_exist_dir
:列出名为 not_exist_dir 的目录内容。由于该目录不存在,ls 会生成一条错误信息并输出到标准错误 (stderr)。
将标准错误重定向到标准输出并写入文件:
ls not_exist_dir > /tmp/output 2>&1
结果:错误信息("ls: cannot access 'not_exist_dir': No such file or directory")将被写入 /tmp/output 文件,而不是显示在终端上。
2>&1
:将标准错误 (文件描述符2
) 重定向到标准输出 (文件描述符1
)。因为标准输出已经被重定向到 /tmp/output 文件,所以错误信息也会被写入该文件。
管道执行的上下文控制
在使用管道时,有时候需要对管道中的数据进行复杂的处理,为了达到这个目的,可以使用花括号{}
或者while
循环来控制命令的执行上下文。
使用花括号 {}
echo hello world | { read x; echo $x; }
结果:变量 x
被正确读取并输出,结果是 hello world
。
echo hello world
:将字符串hello world
输出到标准输出。|
(管道符):将echo hello world
的输出传递给花括号 {} 中的命令。{ read x; echo $x; }
:在当前 shell 中执行read x
和echo $x
,从而使得变量x
在当前 shell 中可见。
使用 while 循环
while
循环也可以用来在管道中处理数据,确保变量在当前 shell 中可见。
echo hello world | while read x; do echo $x; done
结果:变量 x 被正确读取并输出,结果是 hello world。
echo hello world
:将字符串hello world
输出到标准输出。|
(管道符):将echo hello world
的输出传递给while
循环。while read x; do echo $x; done
:在当前 shell 中读取管道中的每一行,并将其存储在变量 x 中,然后输出变量 x 的值。
使用命令替换 $(command)
命令替换允许你捕获命令的输出,并将其存储在变量中。可以使用 $()
或反引号 ` 来实现命令替换。
var=$(echo hello)
echo $var
结果:变量 var
的值是 hello
,因此 echo $var
会输出 hello
。
var=$(echo hello)
:将echo hello
的输出存储在变量var
中。
反引号命令替换
反引号 ` 也可以用来实现命令替换,效果与 $() 相同。
var=`echo hello`
echo $var
结果:变量 var
的值是 hello
,因此 echo $var
会输出 hello
。
Linux 三剑客
在 Linux 中,有三种强大的文本处理工具:grep
、awk
和 sed
。它们通常被称为 "Linux 三剑客"。这些工具各有特色,可以帮助你高效地处理和分析文本数据。
Linux 三剑客介绍
grep
grep
用于全局搜索符合正则表达式的行,并打印出来。它非常适合查找文件中包含特定模式的行。
grep "pattern" filename
pattern
: 要搜索的正则表达式。filename
: 要搜索的文件。
awk
awk
是一个编程语言,用于在文本文件中根据模式处理和分析数据行。它可以对文件中的每一行进行处理,并输出处理后的结果。
awk '{print $1, $2}' filename
{print $1, $2}
: 表示输出每一行的第一个和第二个字段。filename
: 要处理的文件。
sed
sed
是一个流编辑器,用于根据模式修改数据。它可以对文本进行查找、替换、插入、删除等操作。
sed 's/old/new/' filename
s/old/new/
: 表示将匹配old
的字符串替换为new
。filename
: 要处理的文件。
与 SQL 的对比
Linux 三剑客 | sql |
---|---|
grep 数据查找定位 | SELECT * FROM table WHERE column LIKE '%xx' |
awk 数据切片 | SELECT column FROM table |
sed 数据修改 | UPDATE table SET column=new WHERE column=old |
BRE 扩展正则表达式
基本正则表达式 (BRE) 包括以下字符和符号:
^
:匹配行的开头$
:匹配行的结尾[a-z]
[0-9]
:匹配区间内的任意字符,如果开头带有^
表示不能匹配区间内的字符*
:匹配零个或多个前面的字符.
:匹配任意单个字符
ERE 扩展正则表达式
扩展正则表达式 (ERE) 在 BRE 的基础上增加了更多的功能:
?
:匹配零个或一个前面的字符(非贪婪匹配)+
:匹配一个或多个前面的字符()
:分组{}
:匹配前面的字符一定次数|
:匹配多个表达式的任何一个