linux三剑客

linux 三剑客

小技巧

1
2
3
4
# 命令行展开
echo {1..100} # 1,2,3,...,100
echo {1..100..2} # 1,,3,...
echo {a..z} # a,b,...,z

正则表达式

  • 正则工作时以行为单位
  • linux 仅受三剑客(sed, awk, grep)支持,其他命令无法使用。(通配符是大部分普通命令都支持的)

基本正则表达式

功能

  • 匹配字符
  • 匹配次数
  • 位置锚定

符号

  • ^: 尖角号,用于模式的最左侧,如 “^oldboy”,匹配以 oldboy 单词开头的行。
  • $: 美元符,用于模式的最右侧,如 “oldboy$”,匹配以 oldboy 单词结尾的行。
  • ^$: 组合符,表示空行。
  • .: 匹配任意一个且只有一个字符,不能匹配空行。
  • : 转义字符,让特殊含义的字符现出原形,还原本意,例如 . 代表小数点。
  • *: 匹配前一个字符(连续出现)0次或1次以上,重复0次代表空,即匹配所有内容。
  • .*: 组合符,匹配所有内容。
  • ^.*: 组合符,匹配任意多个字符开头的内容。
  • .*$: 组合符,匹配任意多个字符结尾的内容。
  • [^abc]: 匹配除了 ^ 后面的任意字符,^ 表示对abc取反

扩展正则表达式

  • 扩展正则必须用 grep -E 才能生效。
  • +: 匹配前一个字符1次或多次。
  • [符号集]+: 匹配括号内的字符1次或多次。
  • ?: 匹配前一个字符0次或多次。
  • |: 表示或者,同时过滤多个字符串。
  • (): 分组过滤,被括起来的内容表示一个整体。
  • a{n,m}: 匹配前一个字符最少n次,最多m次。
  • a{n,}: 匹配前一个字符最少n次。
  • a{n}: 匹配前一个字符正好n次。
  • a{,m}: 匹配前一个字符最多m次。

grep(Global search Regular expression and Print out the line)

  • 文本搜索工具,根据用户指定的模式(过滤条件),对目标文本进行匹配检查,打印匹配的行。

语法

1
2
3
4
5
6
7
8
9
10
grep [option] [pattern] file
命令 参数 匹配模式 文件数据
-i: ignorance, 忽略字符的大小写
-o: 仅显示匹配到的字符串本身
-v: --invert-match, 显示不能被模式匹配到的行
-E: 支持使用拓展的正则表达式元字符
-q: --quit, --silent, 静默模式, 即不输出任何信息
-n: 显示行号
--color=auto: 为 grep 过滤结果添加颜色
-c: 统计行数

小技巧

1
2
# 过滤空行
grep '^$' filename -n -v

sed(stream editor)

  • 对文件或数据流进行加工处理, 是操作、过滤和转换文本内容的强大工具
  • 常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤指定字符串)、取行(取出指定行)

语法

  • sed [选项] [sed 内置命令字符] [输入文件]
  • 选项:
    1
    2
    3
    4
    -n: 取消默认 sed 的输出,常与 sed 内置命令 p 一起用
    -i: 直接将修改结果写入文件,不用 -i,sed 修改的是内存数据
    -e: 多次编辑,不需要管道符了
    -r: 支持正则表达式
  • 内置命令字符,用于对文件进行不同的操作功能,如对文件增删改查
    1
    2
    3
    4
    5
    a: append,对文件追加,在指定行后面添加一行/多行文本
    d: delete,删除匹配行
    i: insert,表示插入文本,在指定行前添加一行/多行文本
    p: print,打印匹配行的内容,通常 p 与 -n 一起用
    s/正则/替换内容/g: 匹配正则内容,然后替换内容(支持正则),结尾 g 代表全局匹配
  • sed 匹配范围
    1
    2
    3
    4
    5
    空地址: 全文处理
    单地址: 指定文件某一行
    /pattern/: 被模式匹配到的每一行
    范围区间: 10,20 十到二十行; 10,+5 第十行以及向下五行;
    步长: 1~2 表示 1,3,5,7,9,奇数行, 2~2 两个步长,表示 2,4,6,8,10,偶数行

awk(格式化之后再输出文本)

  • 有强大的文本格式化的能力

语法

  • awk [option] ‘pattern[action]’ file …
  • awk 也是按行处理的,根据用户指定的分隔符工作
  • awk 默认以空格为分隔符,且多个空格也识别为一个空格
    1
    2
    3
    4
    5
    6
    awk '{print} $0' # 打印所有内容
    # $0 表示一整行
    # $1 表示第一列信息
    # $2 表示第二列信息
    # $NF 表示当前分割后的最后一列
    # $(NF-1) 表示倒数第二列

内置变量

  • $n: 指定分隔符后,当前记录的第 n 个字段
  • $0: 完整的输入记录
  • FS: 输入字段分隔符,默认是空格
  • OFS: 输出字段分隔符,默认是空格
  • NF(Number of fields): 分隔后,当前行一共有多少个字段
  • NR(Number of records): 当前记录数,行数

自定义输出内容

  • awk 必须外层单引号,内层双引号
  • 内置变量都不得添加双引号,否则会识别为文本,尽量别加引号
    1
    awk '{print "第一列",$1,"第二列",$2}' file

参数

  • -F: 指定分割字段符
    1
    2
    3
    awk -F ',' 'print $0' file
    awk -v FS=',' 'print $0' file
    awk -v FS=',' -v OFS='--------' 'print $1,$2' file
  • -v: 定义或修改一个 awk 内部的变量
  • -f: 从脚本文件中读取 awk 命令

支持 printf 格式化输出

1
awk '{printf "%s\n", $0}' file

模式(也叫条件)

  • BEGIN 和 END (处理文本之前和之后的动作)
    1
    2
    awk 'BEGIN{print "开始:"}{print $0}' file
    awk '{print $0}END{print "结束!"}' file
  • 使用正则
    1
    awk '/正则表达式/{print $0}' file