数据流

数据流重定向

  1. 将命令的输出写入文件

    # ls -al / > ./rootfiles # 写入到rootfiles
    # ls -al / >> ./rootfiles # 追加到rootfiles
    
  2. 将命令报错写入文件

    # ls -al /notadir 2> ./rootfiles # 写入到rootfiles
    # ls -al /notadir 2>> ./rootfiles # 追加到rootfiles
    # ls -al /notadir 2> /dev/null # /dev/null是一个黑洞, 扔进去的东西就没了 
    
  3. 将正确和报错都写入同一个文件

    # ls -al / > ./rootfiles 2>&1 # 写入到rootfiles, &1指代rootfiles
    
  4. 从文件读取

    # ls < listfile
    

一定条件下执行命令

  1. ;分隔符:连续执行多个命令

    # ls;touch newfile
    
  2. &&分隔符: 在前一条命令不报错的时候执行下一条命令

    # ls /tmp && touch /tmp/newfile # /tmp目录存在时创建/tmp/newfile
    
  3. ||分隔符: 在前一条命令报错的时候执行下一条命令

    # ls /tmp/newfile || touch /tmp/newfile # 如果/tmp/newfile不存在就创建它
    

提取信息

  1. 使用grep搜寻字符串

    # grep [expr] [targetfile(s)]
    
    • 数据流重定向给grep

       # ls | grep [expr]
      
    • grep正则表达式的特殊规则

      • {m, n}:大括号需要转义, 亦即写成grep '...\{m, n\}' ...
      • [a-z]: 中括号不需要转义
    • egrep, 延申的正则表达式

      • 可以使用+, ?, |, ()等特殊符号
  2. 使用sed替换删除

    # sed '[line range][actions]' [stdin]
    

    [line range]n1,n2的形式表示n1行到n2行所有行.

    [actions]包括: a: 新增, c: 取代, d: 删除, i:插入, p: 打印, s: 取待, 语法类似vim中ex编辑器.

    如果一个sed不够, 还可以再接sed.

    单引号不要丢

    • 列出/etc/passwd, 删除2到5行

      # cat /etc/passwd | sed '2,5d'
      
    • 在2到5行后增加两行文字111\n222

      # cat /etc/passwd | sed '2,5a111\
      >222' # 通过命令行的换行来增加多行文字
      
    • 将2到5行的:更换为,

      # cat /etc/passwd | sed '2,5s/:/,/g'
      

比较文件不同

  1. diff

    # diff [-bBi] from-file to-file
    比较from-file和to-file的不同, 输出from-file和to-file的差异
    -b: 多个连续空格视作一个
    -B: 忽略空行差异
    -i: 忽略大小写差异
    
  2. cmp

    # cmp [-s] from-file to-file
    如果没有-s参数, 只会列出第一个不同处. 可以比较二进制文件.