jck28 - 小柒 - Linux数据处理

一,数据处理 grep

1.1 基本语法

  • grep [options] pattern [file…] ——[options]表示选项,具体的命令选项见下表。pattern表示要匹配的模式(包括目标字符串、变量或者正则表达式),file表示要查询的文件名,可以是一个或者多个
-c  :只打印匹配的文本行的行数,不显示匹配的内容
-i    :匹配时忽略字母的大小写
-h  :当搜索多个文件时,不显示匹配文件名前缀
-n  :列出所有的匹配的文本行,并显示行号
-l  :只列出含有匹配的文本行的文件的文件名,而不显示具体的匹配内容
-s  :不显示关于不存在或者无法读取文件的错误信息
-v  :只显示不匹配的文本行
-w  :匹配整个单词
-x  :匹配整个文本行
-r  :递归搜索,搜索当前目录和子目录
-q  :禁止输出任何匹配结果,而是以退出码的形式表示搜索是否成功,其中0表示找到了匹配的文本行
-b :打印匹配的文本行到文件头的偏移量,以字节为单位
-E :支持扩展正则表达式
-P :支持Perl正则表达式
-F :不支持正则表达式,将模式按照字面意思匹配

1.2 内容检索

  • 获取行 grep pattern file
    image

  • 获取内容 grep -o pattern file
    image

  • 获取上下文 grep -A -B -C pattern file

    • -A:after- 取后n行的数据
    • -B:before - 取前n行的数据
    • -C: 取前n行和后n行的数据
      image

1.3 文件检索

  • 递归搜索 grep pattern -r dir/
    image

  • 展示匹配文件名 grep -H 111 /tmp/1

  • 不展示匹配文件名 grep -h 111 /tmp/1
    image

  • 只展示匹配文件名 grep -l 111 /tmp/1
    image

1.4 范围约束

  • 忽略大小写 grep -i pattern file
  • 不显示匹配的行 grep -v pattern file
  • 使用扩展正则表达式 grep -E pattern file
  • 文件范围和目录范围约束 grep 111 -r /tmp/demo/ --include "11*"

1.5 进程检索

  • 进程过滤场景比较特殊,需要注意
  • grep 本身会开启新进程,所以需要单独过滤掉 grep 进程

二,数据处理 awk

参考文档: awk命令详解_51CTO博客_awk命令详解if

2.1 基本语法

  • awk 是 linux 下的一个命令,同时也是一种语言解析引擎
  • awk 具备完整的编程特性。比如执行命令,网络请求等
  • 精通 awk,是一个 linux 工作者的必备技能
  • 语法 awk 'pattern{action}'

2.2 awk上下文变量

  • 开始 BEGIN 结束 END
  • 行数 NR
  • 字段与字段数 $1 $2 … $NF NF(代表1,2,n列,NF代表最后一列)
  • 整行 $0
  • 字段分隔符 FS
  • 输出数据的字段分隔符 OFS
  • 记录分隔符 RS
  • 输出字段的行分隔符 ORS

2.3 字段变量用法

  • -F 参数指定字段分隔符,可以用|指定多个- 多分隔符 -F ‘<|>’
  • BEGIN{FS=“_”} 也可以表示分隔符
  • $0 代表当前的记录
  • $1 代表第一个字段
  • $N 代表第 N 个字段
  • $NF 代表最后一个字段
  • $(NF-1) 代表倒数第二个字段

2.4 pattern 表达式案例

  • 开始和结束: awk 'BEGIN{}END{}'

  • 正则匹配 : $1~/pattern/ /pattern/

    • 整行匹配: awk '/Running/'
    • 字段匹配 : awk '$2~/xxx/'
      • $2~/2/ :表示第2列的数据中包含2数字的行所有的数据
        image
  • 行数表达式

    • 取第二行: awk 'NR==2'
      image
    • 去掉第一行 : awk 'NR>1'
      image
  • 区间选择

    • awk '/aa/,/bb/' :取区间在20~30的行数据
      image

    • awk '/1/,NR==2'
      image

  • 比较表达式 :$2>2 $1=="b"
    image

2.5 行为表达式 {action}

  • 打印 {print $0} {print $2}
  • 赋值 {$1="abc"}
  • 处理函数
  • 原始内容 $0
  • 更新后内容 {$1=$1;print $0}
  • 实例:
    • 单行转多行:echo 1:2:3 | awk ‘BEGIN{RS=“:”}{print $0}’

    • 多行变单行:awk ‘BEGIN{RS=“”;FS=“\n”;OFS=“:”}{$1=$1;print $0}’ / awk ‘BEGIN{ORS=“:”}{$1=$1;print $0}’

    • 计算平均数:awk ‘BEGIN{total=0;FS=“,”}{total+=$2}END{print total/NR}’

2.6 awk 的词典结构 array

三,数据处理 sed(常用于定位)

3.1 基本语法与常用参数

  • 语法结构 sed [addr]X[options]
    • -e 表达式
    • sed -n ‘2p’ 打印第二行
    • sed ‘s#hello#world#’ 修改替换
    • -i 直接修改源文件
    • -E 扩展表达式
    • –debug 调试

3.2 pattern 表达式

  • 行数与行数范围 20 30,35
  • 正则匹配 /pattern/
  • 区间匹配 //,//
    image

3.3 action 表达式

  • p 打印,通常结合-n 参数:sed -n ‘2p’

  • s 查找替换:s/REGEXP/REPLACEMENT/[FLAGS]
    image
    (以1结尾的数据都乘以100)
    image

    • s 后面的追加字符可以为任意字符
      image

    • g 表示全局匹配
      image

    • & 表示匹配内容(在匹配的规则前/后添加对应的内容)
      image

  • d 删除,删除前两行 sed ‘1,2d’;删除最后一行 sed ‘$d’
    image

  • a 追加(匹配规则行后追加)
    image

  • c 改变(!!! 改变整行的数据)
    image

  • i 插入内容到匹配行之前

  • e 执行命令

  • 分组匹配与字段提取:sed ‘s#([0-9])|([a-z])#\1 \2#’

3.4 反向引用

  • 使用()对数据进行分组
  • 使用\1 \2 反向引用分组

四,linux三剑客与管道使用

4.1 程序运行环境输入与输出

  • 标准输入 0

    • read a;echo $a
  • 标准输出 1

    • echo ceshiren.com
      image
  • 错误输出

    • ls not_exist_dir

4.2 管道重定向

  • 管道与管道之间可以重定向
  • 管道与文件之间可以重定向
    image

4.3 管道连接符 |

  • 管道连接符 | 可以连接多个程序的执行
  • 管道连接是以子进程的方式启动的

4.4 管道执行的上下文控制

  • 使用 { command; } 注意花括号与内部命令之间的空格与分号
  • 使用控制逻辑 while read 组合
  • 使用 $() ``
    • 如下两个方式可以获得变量x
      image

4.5 三剑客介绍

4.6 BRE 基本正则表达式

  • ^ 开头 $结尾
  • [a-z] [0-9] 区间,如果开头带有^表示不能匹配区间内的元素
  • * 0 个或多个
  • . 表示任意字符

4.7 ERE 扩展正则表达式

  • 基本正则表达式(BRE)基础上的扩展
  • ? 非贪婪匹配
  • + 一个或者多个
  • () 分组
  • {} 范围约束
  • | 匹配多个表达式的任何一个
    image

五,Linux进阶命令

4.1 curl 命令

4.1.1 接口请求

  • curl是一个发起请求数据给服务器的工具
  • curl支持的协议FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP
  • curl是一个非交互的工具

4.1.2 curl发起请求

  • 发起get请求 :curl -G url
  • 发起post请求 : curl -d “name=xxx” url / curl -X POST url

4.1.3 常用参数

  • curl -o filename url 保存响应内容
  • curl -i url 显示头信息
  • curl -I url 仅显示头信息
  • curl -s url 静默访问不输出错误和进度
  • curl -v url 输出通信过程
  • curl -H headers url 添加头信息
  • curl -x “ip:port” url 为请求添加代理

4.2 jq工具

4.2.1 jq安装

  • yum install jq

4.2.2 常用命令

  • jq格式化:echo ‘{“a”:1,“b”:2}’ | jq ‘.’

  • json 数据提取

    • 提取指定key: echo ‘{“foo”:53,“bar”:“some datas”}’ | jq .foo
    • 从数组中提取单个数据: echo ‘[{“a”:1,“b”:2},{“c”:3,“d”:4}]’ |jq .[0]
    • 从数组中提取所有数据: echo ‘[{“a”:1,“b”:2},{“c”:3,“d”:4}]’ |jq .
    • 从数组中提取多个值: echo ‘[{“a”:1,“b”:2},{“c”:3,“d”:4},{“e”:5,“f”:6}]’ |jq .[0,2]
  • json 数据重组

    • 数据重组成数组:echo ‘{“a”:1,“b”:2,“c”:3,“d”:4}’| jq ‘[.a,.b]’
    • 数据重组成对象:echo ‘{“a”:1,“b”:2,“c”:3,“d”:4}’| jq ‘{“tmp”:.b}’