linux入门004 | 重定向、管道和grep

2024-06-20 19:21:43 浏览数 (3)

前言

经常打游戏的朋友都知道,掌握数据意味着掌握胜利 这在linux也是相同的。 本章,我们将探讨重定向 (> 和 >>) 的奥秘、管道 (|) 的魔力, 以及 grep这把文本处理的瑞士军刀,让你的数据操控更上层楼

1. 重定向:数据流动的方向

基础重定向 >

我来解说一下上期制作文本的语句

tail获取文本的最后三十行内容

使用 > 将文本内容传递到new.txt

In [1]:

代码语言:javascript复制
代码语言:javascript复制
!tail -n 15 /home/mw/input/meteva7050/nmc_met_tutorial-master/nmc_met_tutorial-master/meteva/input/meb/m1.txt > new.txt
代码语言:javascript复制

In [3]:

代码语言:javascript复制
代码语言:javascript复制
!cat -n /home/mw/project/new.txt
代码语言:javascript复制
代码语言:javascript复制
     1	12625  19.95  49.28  857 1    9  140    1 9999    0    8    1    0.5   35   90  200   15    8   10   16.7 9999 9999 9999 9999
     2	12670  21.77  49.70  331 1    6   80    2  184    0    1    1   9999 9999   60 9999   17   22    2   19.6   25   12 9999 9999
     3	12690  22.33  49.45  422 1    5   90    2  186    0    1    1   9999 9999   40 9999   18   22    2   18.9   23   12 9999 9999
     4	12695  22.77  49.80  280 1 9999    0    1  192    0    0    0   9999 9999 9999 9999   18 9999  100   19.3 9999 9999 9999 9999
     5	64910   9.70   4.02    9 1    9    0    0  144 9999    6    6     15   39   90  300   23    8   60   24.0 9999 9999 9999 9999
     6	01023  18.53  69.05   76 1 9999    0    0  169    0    0    0   9999 9999 9999 9999   17 9999    0   17.3 9999 9999 9999 9999
     7	01425   6.50  58.50   66 1 9999  320    1  184    1    0    0      2 9999 9999 9999   14 9999    0   14.9 9999 9999 9999 9999
     8	01424   6.35  59.63    2 1 9999    0    0  176    1    0    0     26 9999 9999 9999   15 9999    0   16.8 9999 9999 9999 9999
     9	01150  14.95  66.48  251 1 9999  100    1 9999 9999    0    0    0.8 9999 9999 9999   16 9999    0   16.1 9999 9999 9999 9999
    10	01488  10.82  60.12  170 1 9999  350    1 9999 9999    0    0      8 9999 9999 9999   16 9999    0   16.9 9999 9999 9999 9999
    11	48679 103.67   1.63   40 1    9  320    0  118 9999    6    2   9999   39   40  300   24   10   61   24.4   24   18 9999 9999
    12	16364  16.37  38.76  996 1 9999  240    2 9999    0    0    0   9999 9999 9999 9999   17 9999    0   18.4 9999 9999 9999 9999
    13	16415  14.87  38.58   45 1 9999  180    0  137    0    0    0   9999 9999 9999 9999   23 9999    0   24.1 9999 9999 9999 9999
    14	16081   9.26  45.46  107 1 9999    0    0  146    0    0    0   9999 9999 9999 9999   24 9999    0   26.7 9999 9999 9999 9999
    15	16314  16.66  40.68  496 1 9999   10    5  150    0    0    0   9999 9999 9999 9999   17 9999    0   22.9 9999 9999 9999 9999

追加重定向 >>

但若你想在文件末尾追加内容而非覆盖,那么使用>> :

In [4]:

代码语言:javascript复制
代码语言:javascript复制
!echo "Hello world" >> /home/mw/project/new.txt
代码语言:javascript复制

In [5]:

代码语言:javascript复制
代码语言:javascript复制
!cat -n /home/mw/project/new.txt
代码语言:javascript复制
代码语言:javascript复制
     1	12625  19.95  49.28  857 1    9  140    1 9999    0    8    1    0.5   35   90  200   15    8   10   16.7 9999 9999 9999 9999
     2	12670  21.77  49.70  331 1    6   80    2  184    0    1    1   9999 9999   60 9999   17   22    2   19.6   25   12 9999 9999
     3	12690  22.33  49.45  422 1    5   90    2  186    0    1    1   9999 9999   40 9999   18   22    2   18.9   23   12 9999 9999
     4	12695  22.77  49.80  280 1 9999    0    1  192    0    0    0   9999 9999 9999 9999   18 9999  100   19.3 9999 9999 9999 9999
     5	64910   9.70   4.02    9 1    9    0    0  144 9999    6    6     15   39   90  300   23    8   60   24.0 9999 9999 9999 9999
     6	01023  18.53  69.05   76 1 9999    0    0  169    0    0    0   9999 9999 9999 9999   17 9999    0   17.3 9999 9999 9999 9999
     7	01425   6.50  58.50   66 1 9999  320    1  184    1    0    0      2 9999 9999 9999   14 9999    0   14.9 9999 9999 9999 9999
     8	01424   6.35  59.63    2 1 9999    0    0  176    1    0    0     26 9999 9999 9999   15 9999    0   16.8 9999 9999 9999 9999
     9	01150  14.95  66.48  251 1 9999  100    1 9999 9999    0    0    0.8 9999 9999 9999   16 9999    0   16.1 9999 9999 9999 9999
    10	01488  10.82  60.12  170 1 9999  350    1 9999 9999    0    0      8 9999 9999 9999   16 9999    0   16.9 9999 9999 9999 9999
    11	48679 103.67   1.63   40 1    9  320    0  118 9999    6    2   9999   39   40  300   24   10   61   24.4   24   18 9999 9999
    12	16364  16.37  38.76  996 1 9999  240    2 9999    0    0    0   9999 9999 9999 9999   17 9999    0   18.4 9999 9999 9999 9999
    13	16415  14.87  38.58   45 1 9999  180    0  137    0    0    0   9999 9999 9999 9999   23 9999    0   24.1 9999 9999 9999 9999
    14	16081   9.26  45.46  107 1 9999    0    0  146    0    0    0   9999 9999 9999 9999   24 9999    0   26.7 9999 9999 9999 9999
    15	16314  16.66  40.68  496 1 9999   10    5  150    0    0    0   9999 9999 9999 9999   17 9999    0   22.9 9999 9999 9999 9999
    16	Hello world

Hello world

2. 管道:一定是特别的缘分

管道,以 | 符号相连,能将一个命令的输出直接作为另一个命令的输入,实现命令的串联操作

In [8]:

代码语言:javascript复制
代码语言:javascript复制
ls -l /home/mw/input/meteva7050/nmc_met_tutorial-master/nmc_met_tutorial-master/meteva/input/meb | grep txt
代码语言:javascript复制
代码语言:javascript复制
-rw-r--r-- 1 mw root   513788 May 21 08:51 m1.txt
-rw-r--r-- 1 mw root    28586 May 21 08:51 m2.txt
-rw-r--r-- 1 mw root    19834 May 21 08:51 m3.txt
-rw-r--r-- 1 mw root   822120 May 21 08:51 m4.txt
-rw-r--r-- 1 mw root   100100 May 21 08:51 m8.txt
-rw-r--r-- 1 mw root    33943 May 21 08:51 rain01.m3.txt
-rw-r--r-- 1 mw root   749845 May 21 08:51 sevp.txt

以上是实现显示文件夹下所有的txt文件

你问grep是什么?别急,看下面

3. grep : 大浪淘沙

grep(Global Regular Expression Print,全局正则表达式打印)是Linux及Unix系统中一个强大的文本搜索工具,用于在文件中按照指定的模式(可以是简单的字符串或者复杂的正则表达式)进行搜索,并将匹配到的行打印出来

特定检索

文本内检索有9999的行

In [10]:

代码语言:javascript复制
代码语言:javascript复制
!grep "9999" /home/mw/project/new.txt
代码语言:javascript复制
代码语言:javascript复制
12625  19.95  49.28  857 1    9  140    1 9999    0    8    1    0.5   35   90  200   15    8   10   16.7 9999 9999 9999 9999
12670  21.77  49.70  331 1    6   80    2  184    0    1    1   9999 9999   60 9999   17   22    2   19.6   25   12 9999 9999
12690  22.33  49.45  422 1    5   90    2  186    0    1    1   9999 9999   40 9999   18   22    2   18.9   23   12 9999 9999
12695  22.77  49.80  280 1 9999    0    1  192    0    0    0   9999 9999 9999 9999   18 9999  100   19.3 9999 9999 9999 9999
64910   9.70   4.02    9 1    9    0    0  144 9999    6    6     15   39   90  300   23    8   60   24.0 9999 9999 9999 9999
01023  18.53  69.05   76 1 9999    0    0  169    0    0    0   9999 9999 9999 9999   17 9999    0   17.3 9999 9999 9999 9999
01425   6.50  58.50   66 1 9999  320    1  184    1    0    0      2 9999 9999 9999   14 9999    0   14.9 9999 9999 9999 9999
01424   6.35  59.63    2 1 9999    0    0  176    1    0    0     26 9999 9999 9999   15 9999    0   16.8 9999 9999 9999 9999
01150  14.95  66.48  251 1 9999  100    1 9999 9999    0    0    0.8 9999 9999 9999   16 9999    0   16.1 9999 9999 9999 9999
01488  10.82  60.12  170 1 9999  350    1 9999 9999    0    0      8 9999 9999 9999   16 9999    0   16.9 9999 9999 9999 9999
48679 103.67   1.63   40 1    9  320    0  118 9999    6    2   9999   39   40  300   24   10   61   24.4   24   18 9999 9999
16364  16.37  38.76  996 1 9999  240    2 9999    0    0    0   9999 9999 9999 9999   17 9999    0   18.4 9999 9999 9999 9999
16415  14.87  38.58   45 1 9999  180    0  137    0    0    0   9999 9999 9999 9999   23 9999    0   24.1 9999 9999 9999 9999
16081   9.26  45.46  107 1 9999    0    0  146    0    0    0   9999 9999 9999 9999   24 9999    0   26.7 9999 9999 9999 9999
16314  16.66  40.68  496 1 9999   10    5  150    0    0    0   9999 9999 9999 9999   17 9999    0   22.9 9999 9999 9999 9999

反向操作

文本内检索没有9999的行

In [13]:

代码语言:javascript复制
代码语言:javascript复制
!grep -v "9999" /home/mw/project/new.txt
代码语言:javascript复制
代码语言:javascript复制
Hello world

4. 组合技:打出华丽combo

当然,我们学了以上指令,特别是管道符号,这让我们能手搓组合技能,帅气地达到目的

筛选文本特定行

比如查看文本倒数十五行内有9999的内容

In [17]:

代码语言:javascript复制
代码语言:javascript复制
!tail -n 15 /home/mw/input/meteva7050/nmc_met_tutorial-master/nmc_met_tutorial-master/meteva/input/meb/m1.txt | grep "9999"
代码语言:javascript复制
代码语言:javascript复制
12625  19.95  49.28  857 1    9  140    1 9999    0    8    1    0.5   35   90  200   15    8   10   16.7 9999 9999 9999 9999
12670  21.77  49.70  331 1    6   80    2  184    0    1    1   9999 9999   60 9999   17   22    2   19.6   25   12 9999 9999
12690  22.33  49.45  422 1    5   90    2  186    0    1    1   9999 9999   40 9999   18   22    2   18.9   23   12 9999 9999
12695  22.77  49.80  280 1 9999    0    1  192    0    0    0   9999 9999 9999 9999   18 9999  100   19.3 9999 9999 9999 9999
64910   9.70   4.02    9 1    9    0    0  144 9999    6    6     15   39   90  300   23    8   60   24.0 9999 9999 9999 9999
01023  18.53  69.05   76 1 9999    0    0  169    0    0    0   9999 9999 9999 9999   17 9999    0   17.3 9999 9999 9999 9999
01425   6.50  58.50   66 1 9999  320    1  184    1    0    0      2 9999 9999 9999   14 9999    0   14.9 9999 9999 9999 9999
01424   6.35  59.63    2 1 9999    0    0  176    1    0    0     26 9999 9999 9999   15 9999    0   16.8 9999 9999 9999 9999
01150  14.95  66.48  251 1 9999  100    1 9999 9999    0    0    0.8 9999 9999 9999   16 9999    0   16.1 9999 9999 9999 9999
01488  10.82  60.12  170 1 9999  350    1 9999 9999    0    0      8 9999 9999 9999   16 9999    0   16.9 9999 9999 9999 9999
48679 103.67   1.63   40 1    9  320    0  118 9999    6    2   9999   39   40  300   24   10   61   24.4   24   18 9999 9999
16364  16.37  38.76  996 1 9999  240    2 9999    0    0    0   9999 9999 9999 9999   17 9999    0   18.4 9999 9999 9999 9999
16415  14.87  38.58   45 1 9999  180    0  137    0    0    0   9999 9999 9999 9999   23 9999    0   24.1 9999 9999 9999 9999
16081   9.26  45.46  107 1 9999    0    0  146    0    0    0   9999 9999 9999 9999   24 9999    0   26.7 9999 9999 9999 9999
16314  16.66  40.68  496 1 9999   10    5  150    0    0    0   9999 9999 9999 9999   17 9999    0   22.9 9999 9999 9999 9999

过滤并排序进程列表

如果你想查看所有与Python相关的正在运行的进程,并按内存使用量排序

In [ ]:

代码语言:javascript复制

In [18]:

代码语言:javascript复制
代码语言:javascript复制
!ps aux | grep '[p]ython' | sort -k4nr
代码语言:javascript复制
代码语言:javascript复制
mw             1  0.1  0.6 348464 53644 ?        Ssl  08:36   0:01 /opt/conda/bin/python /opt/conda/bin/jupyter-kernelgateway --log-level='WARN' --KernelGatewayApp.ip=0.0.0.0 --KernelGatewayApp.base_url=source/default/user/620dbd752e0e510017d2f245/label/ten.nj.sa3/lab/664c5d16d5aec9396de5408d --KernelGatewayApp.port=8889 --KernelGatewayApp.allow_origin='*' --JupyerWebsocketPersonality.list_kernels=True
mw            53  0.0  0.6 577496 48744 ?        Ssl  08:36   0:00 /opt/conda/bin/python -m ipykernel_launcher -f /home/mw/.local/share/jupyter/runtime/kernel-3d390ee0-0b96-4b51-9491-51342574d02b.json

查找并保存特定文本信息

检索带有“01”的行并重定向到新的文本文件

In [21]:

代码语言:javascript复制
代码语言:javascript复制
cat /home/mw/project/new.txt | grep "01" > newnew.txt
代码语言:javascript复制

In [22]:

代码语言:javascript复制
代码语言:javascript复制
cat /home/mw/project/newnew.txt
代码语言:javascript复制
代码语言:javascript复制
01023  18.53  69.05   76 1 9999    0    0  169    0    0    0   9999 9999 9999 9999   17 9999    0   17.3 9999 9999 9999 9999
01425   6.50  58.50   66 1 9999  320    1  184    1    0    0      2 9999 9999 9999   14 9999    0   14.9 9999 9999 9999 9999
01424   6.35  59.63    2 1 9999    0    0  176    1    0    0     26 9999 9999 9999   15 9999    0   16.8 9999 9999 9999 9999
01150  14.95  66.48  251 1 9999  100    1 9999 9999    0    0    0.8 9999 9999 9999   16 9999    0   16.1 9999 9999 9999 9999
01488  10.82  60.12  170 1 9999  350    1 9999 9999    0    0      8 9999 9999 9999   16 9999    0   16.9 9999 9999 9999 9999

小结

在Linux学习的旅途中,掌握重定向、管道和grep命令是迈向高效操作和自动化处理的关键一步。本课内容回顾了这些基础而强大的工具,它们构成了处理文本数据和自动化脚本的核心能力。

重定向:重定向允许你改变命令的标准输入与输出,从而灵活地处理数据流。

  • 标准输出重定向 (>):覆盖目标文件内容,例如 ls > fileList.txt 将目录列表保存为文件。
  • 追加重定向 (>>):在目标文件末尾追加内容,适合累积日志或数据,如 echo "New entry" >> diary.txt

管道:管道(|)作为数据的传输通道,连接两个命令,使前者命令的输出直接成为后者的输入,极大提升了命令的组合性和灵活性。例如,ls | grep ".pdf" 只列出当前目录下的PDF文件。

grep:作为文本搜索的利器,grep凭借其正则表达式的能力,能够在文件或标准输入中查找并显示包含特定模式的行。结合选项,如 -i(忽略大小写)、-v(反向匹配)、-r(递归搜索目录),grep几乎能满足所有文本搜索需求。

通过这些概念的学习与实践,你已解锁了在Linux环境中高效处理文本、过滤信息、自动化日志分析等多种技能。无论是日常管理、编程调试,还是数据分析,重定向、管道和grep的组合使用都能让你的操作更加游刃有余。

0 人点赞