Skip to content

Linux三剑客与管道使用

Linux 三剑客与管道使用

简介

在 Linux 中,数据处理的效率和灵活性至关重要。grepawksed被称为 Linux三剑客,是处理文本文件的利器。分别用于查找、切片和修改数据,通过管道连接可以组合使用,完成复杂的数据处理任务。

程序运行环境输入与输出

在 Linux 中,程序通常有三个标准的输入输出流:

  • 标准输入(stdin):文件描述符为 0
  • 标准输出(stdout):文件描述符为 1
  • 标准错误(stderr):文件描述符为 2

uml diagram

标准输入 0

标准输入是程序默认从键盘读取输入的地方,可以使用以下命令读取用户输入并回显。

read a
echo $a

标准输出 1

标准输出是程序默认输出信息到屏幕的地方。

echo ceshiren.com

错误输出 2

标准错误输出用于显示错误信息。

is not_exist_dir

管道

管道可以将一个命令的输出作为另一个命令的输入

uml diagram

(重点)管道连接符 |

管道连接符 | 用于连接多个命令,使一个命令的输出成为下一个命令的输入,管道连接是以子进程的方式启动的。例如:

echo hogwarts | { read line; echo input is $line; }
  • echo hogwarts:这个命令将字符串hogwarts输出到标准输出(stdout)。
  • |(管道符):将echo hogwarts的输出被传递给{}内的命令。
  • read lineread命令从标准输入(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 varread 命令从标准输入 (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 xecho $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 中,有三种强大的文本处理工具:grepawksed。它们通常被称为 "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 的基础上增加了更多的功能:

  • ?:匹配零个或一个前面的字符(非贪婪匹配)
  • +:匹配一个或多个前面的字符
  • ():分组
  • {}:匹配前面的字符一定次数
  • |:匹配多个表达式的任何一个

总结

  • 简介
  • 程序运行环境输入与输出
  • 管道
  • 三剑客官网:grepawksed