shell 文本数据处理

  在 linux shell 中,不同工具、程序间通过文本进行数据交互,即以文本作为输入、输出标准格式。文本成为公共的协议,使得整个 shell 成为一个开放式环境,这给文本数据的处理带来了很大的方便。

重定向

  程序的输出可通过符号 >>> 实现覆盖、追加重定向到文件。我们用 echo 命令(回显,将输入参数原样输出到控制台)和cat 命令(吐文件,将文件内容输出到控制台显示)演示重定向。

  • echo

    $ echo hello world

    hello world

  • 重定向 覆盖 到文件 test.txt

    $ echo -ne “this\nis\na\n” > test.txt

    $ cat test.txt

    this
    is
    a

  • 重定向 追加 到文件 test.txt

    $ echo -ne “test\ntext.\n” >> test.txt

    $ cat test.txt

    this
    is
    a
    test
    text.

  • 标准输出 重定向到 std.txt,标准错误 重定向到 err.txt

    $ (echo hello world && cat a) > std.txt 2> err.txt

    $ cat std.txt

    hello world

    $ cat err.txt

    cat: a: No such file or directory

  • 标准错误 重定向到 标准输出

    $ (echo hello world && cat a) > std.txt 2>&1

    $ cat std.txt

    hello world
    cat: a: No such file or directory

管道

  通过管道(使用符号 | 表示),可以把一个程序(cat)的输出,作为另一个程序(echo)的输入。

  • cat test.txt | xargs echo

    this is a test text.

grep 模式搜索

  简单的模式搜索可以使用 grep 命令来完成。

  • Usage: grep [OPTION…] PATTERNS [FILE…]

  • 常用 OPTION

    -n 显示行号
    -H 显示文件名
    -h 隐藏文件名
    -r 递归整个目录中的文件
    -o 只显示匹配的内容
    -E 使用扩展的正则表达式 PATTERN

sed 匹配替换

  • Usage: sed OPTIONS… [SCRIPT] [INPUTFILE…]

  • 常用 OPTIONS

    -i 在原文件中 in-place 执行操作
    -e 指定 SCRIPT,可以有多个,如 sed -e 'SCRIPT1' -e 'SCRIPT2' [INPUTFILE...]
    -f 从文件中加载 SCRIPT
    -r, -E 使用扩展的正则表达式
    -u 不使用缓存
    -n 取消自动输出,只输出 p 操作内容

  • [SCRIPT] 格式: [addr]X[options]

    • [addr] 用于定位需要处理的行

      [addr] 格式用例说明
      行号11
      行 range15,3015 ~ 30
      正则匹配/foo/包含字符串 foo 的行
      取反1!除第 1 行外的所有行
    • X 是操作命令,[options]X 命令的参数

      X 命令[options]用例说明
      i要插入的内容1i before在第1行前插入一行,内容为 before
      a要追加的内容1a after在第1行后追加一行,内容为 after
      rfile1r title.txt读取文件 title.txt 中的内容,输出到第1行后面
      wfile/foo/w title.txt将包含 foo 的行输出到文件 file.txt
      s/pattern/replace/[g]s/foo/bar/g将所有 foo 替换为 bar,不加 g 则只替换每行中第一次出现的 foo
      z-/foo/ z将包含 foo 的行清空,保留这个空行
      d-/foo/ d删除包含 foo 的行
      qexit-code/foo/q 2处理完包含 foo 的行就退出,返回错误码 2 到shell
      =-=输出所有行的行号
    • 对匹配的行,执行多个 SCRIPT 操作

      在一条 sed 命令中,可以使用多条用 ; 间隔开的 SCRIPT,形如 sed '[a1]X1[o1]; [a2]X2[o2]; [a3]X3[o3]' [INPUTFILE…]

  • 替换

    使用 sed 最多的场景,就是批量替换文件中的特定字符串。比如,将 tmpdir/ 目录下所有 .html 文件中的 twitter.com 全部替换为 x.com,可以用下面这个命令实现:
    sed -i 's/twitter\.com/x\.com/g' tmpdir/*.html

    其中的 .com 没必要写两遍,可以用正则表达式 () 捕获内容序号来代替:
    sed -i -E 's/twitter(\.com)/x\1/g' tmpdir/*.html

awk 复杂业务编程

如果配合 grepsed 仍不能优雅地达成目标,可以考虑一下 awk。比如一些涉及多行查找、替换、统计的需求,awk 一般都是能满足的。

  • Usage:
    awk [OPTIONS] ‘program’ [INPUTFILE…]
    awk -f program-file [INPUTFILE…]

在命令行管道中使用 awk

几乎 grep, sed, cut 能做的所有事,awk 都可以做,我们使用那些 awk 可以简化命令输入、提高效率的场景去使用 awk

  • 截取多列内容

    比如从 ps 命令的输出中取 TIMECMD 列:

    PID TTY          TIME CMD
     11 pts/0    00:00:00 bash
     67 pts/0    00:00:00 ps
    

    $ ps | awk '{print $3" "$4}'

    TIME CMD
    00:00:00 bash
    00:00:00 ps
    00:00:00 awk
    
  • 统计某些列所有不同值

    echo -e 'hi morning\nhi noon\nall right A\nall right B' | awk '{if(!n[$1 $2]++){ln++; print ln" "$0}}'

    1 hi morning
    2 hi noon
    3 all right A
    

编写 awk 脚本文件

参考

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游戏AI开发者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值