shell-文本处理学习笔记四

grep和egrep

  • 第一种形式:grep [option] [pattern] [file1 file2 ...]
  • 第二种形式: command | grep [option] [patern]
  • 选项:option
    • -v 不显示匹配行
      • grep -v python file
    • -i 搜索时忽略大小写
    • -n 显示行号
      • grep -n python file 匹配显示文件file中包含python的行号
    • -r 递归搜索
    • -E 支持扩展正则表达式
    • -F 不按正则表达式匹配,按照字符串字面意思匹配
    • -c 只显示匹配行总数
    • -W 匹配整词
    • -x 匹配整行
    • -l 只显示文件名,不显示内容
    • -s 不显示错误信息

sed命令

简介

  • sed(Stream Editor), 流编辑器。对标准输出或文件逐行进行处理。

语法格式

  • 第一种形式:stdout | sed [option] "pattern command"
  • 第二种形式:sed [option] "pattern command" file

sed的option选项

  • -n 只打印模式匹配行
    • sed -n '/python/p' sed.txt 匹配sed.txt文件中, 包含python字符串的行,并打印匹配的行
  • -e 直接在命令行进行sed编辑,默认选项
    • sed -n -e '/python/p' -e '/PYTHON/p' sed.txt
  • -f 编辑动作保存在文件中,指定文件执行
    • sed -n -f edit.sed sed.txt
  • -r 支持扩展正则表达式
    • sed -n -r '/python|PYTHON/p' sed.txt
  • -i 直接修改文件内容
    • sed -n 's/love/like/g;p' sed.txt 对sed.txt文件,把love替换成like并打印
    • sed -i 's/love/like/g' sed.txt 修改sed.txt文件,把love替换成like

sed的pattern模式

  • 10command 匹配到第10行
    • sed -n "17p" file 打印file文件的17行
  • 10,20command 匹配从第10行开始,到第20行结束
    • sed -n "10, 20p" file 打印file文件的第10到20行
  • 10,+5command 匹配从第10行开始,到第16行结束
    • sed -n "10, +5p" file 打印file文件中从第10行开始,往后面加5行的所有行
  • /pattern1/command 匹配到pattern1的行
    • sed -n "/^root/p" file 打印file文件中以root开头的行
    • sed -n "/\/sbin\/nologin/p" /etc/passwd 打印/etc/passwd中以/sbin/nologin的行
  • /pattern1/,/pattern2/command 匹配到pattern1的行开始,到匹配到pattern2的行结束
    • sed -n '/^hgds/,/^yarn/p' /etc/passwd 打印/etc/passwd文件中匹配以hgds开头的行,到yarn开头的行结束
  • 10,/pattern1/command 匹配从第10行开始,到匹配到pattern1的行结束
    • sed -n '4,/^hdfs/p' /etc/passwd 匹配/etc/passwd文件中,从第4行开始,直到hdfs开头的行结束
  • /pattern1/,10command 匹配到pattern1的行开始,到第10行匹配结束
    • sed -n '/root/, 10p' /etc/passwd 匹配/etc/passwd文件中,以root开头的行,到第10行结束

sed中编辑命令command详解

查询
  • p 打印
增加
  • a 行后追加
    • sed -i '/\bin\/bash/a This is user which can login to system' file 匹配file文件中,以/bin/bash的行,并在行后追加This is user which can login to system这句
  • i 行前打印
    • sed -i '/^hdfs/,/^yarn/i aaa' file 匹配file文件中,以hdfs开头的到yarn开头的行结束,并在匹配的行前追加aaa
  • r 外部文件读入,行后追加
    • sed -i '/root/r read.file' file 匹配file文件中,读取read.file的内容追加到,以root开头的行后
  • w 匹配行写入外部文件
    • sed -i '/\bin\/bash/w writefile.txt' file 将匹配file文件中, 以/bin/bash的行另存到writefile.txt文件中
删除
  • d 删除
    • sed '1d' file 删除file文件第一行
    • sed '1,3d' file 删除file文件第一行到第三行
    • sed -i '/\/sbin\/nologin/d' file 删除file文件,匹配/sbin/nologin的行
    • sed -i '/^mail/,/^ftp/d file' 删除file文件中,匹配以mail开头的行,直到ftp开头的行结束
    • sed -i '/^[:blank:]*#/d,/^$/d' /etc/nginx.conf 删除/etc/nginx.conf文件中,空格和注释行
修改
  • s/old/new 将行内第一个old替换为new
    • sed -i 's/root/ROOT' file 匹配file文件中,替换第一个以root的行为ROOT
  • s/old/new/g 将行内全部的old替换为new
    • sed -i 's/\/bin\/bash/\/BIN\/BASH/g' file 匹配file文件中,将所有/bin/bash替换成/BIN/BASH的行
  • s/old/new/2g 将行内从第2个开始,到剩下所有的old替换为new
    • sed -i 's/root/ROOT/2g' file 匹配file文件中,同一行内替换以第二个root的行到剩下所有的内容为ROOT
  • s/old/new/ig 将行内old全部替换为new,忽略大小写
    • sed -i 's/root/ROOT/ig' file 匹配file文件中,同一行内,所有以root的行,并替换为ROOT,不区分大小写
    • sed -i 's/^[^#]/\*&/g' etc/nginx.conf
示例
# 修改/etc/passwd中第一行第一个root为ROOT
sed -i '1s/root/ROOT' /etc/passwd
# 修改/etc/passwd中第5行到第10行中所有的/sbin/nologin为/bin/bash
sed -i '5,10s/\/sbin\/nologin/\/bin\/bash/g' /etc/passwd
# 修改/etc/passwd中匹配到/sbin/nologin的行,将匹配到行的login改为大写的LOGIN
sed -i '/\/sbin\/nologin/s/login/LOGIN' /etc/passwd
# 修改/etc/passwd中从匹配以root开头的行,到匹配到行中包含mail的所有行,修改内容为将这些所有匹配到的行的bin改为HADOOP
sed -i '/^root/, /mail/s/bin/HADOOP/g' /etc/passwd
# 修改/etc/passwd中匹配以root开头的行,到第15行中所有的行,修改内容为将这些行中的bin改为HADOOP
sed -i  '/root/,15s/bin/HADOOP/g' /etc/passwd
# 修改/etc/passwd中从第15行开始,到匹配到yarn开头的所有行,修改内容为将这些行中的bin改为HADOOP
sed -i '15,/^yarn/s/bin/HADOOP/g' /etc/passwd
# 在/etc/passwd文件每一行前面追加Insert Line Before Every Line
sed -i 'i Insert Line Before Every Line' /etc/passwd
其他命令
  • = 显示行号
    • sed -n '/\sbin\/nologin/=' file 匹配file文件中,以/sbin/nologin的行号
反向引用
  • sed -i 's/had..p/&s/g' file 匹配file文件中,匹配had开始,已p结尾的字符,并在匹配的字符串后面加个s
  • sed -i 's/\(had..p\)/\1s/g' file 匹配file文件中,匹配had开始,已p结尾的字符,并在匹配的字符串后面加个s
  • sed -i 's/\(had\).../\1doop' file
sed中引用变量注意事项
  • 匹配模式中存在变量,建议使用双引号
  • sed中需要引入自定义变量时,如果外面使用单引号,则自定义变量必须使用单引号
#!/bin/bash

old_str=hadoop
new_str=HADOOP

sed -i "s/$old_str/$new_str/g" test.txt

# 方法二
sed -i 's/'$old_str'/'$new_str'/g' test.txt

awk命令

awk 简介

  • awk是一个文本处理工具,通常用于处理数据并生成结果报告

awk的语法模式

  • 第一种形式: awk 'BEGIN {} pattern{commands}END{} file_name
  • 第二种形式:standard output | awk 'BEGIN{}pattern{commands}END{}
  • 语法格式说明
    • BEGIN{} 正式处理数据之前执行
    • pattern 匹配模式
    • {commands} 处理命令,可能多行
    • END{} 处理完所有匹配数据后执行

awk常用的内置变量

  • $0 整行内容
    • awk '{print $0} /etc/passwd
  • $1-$n 指定分割符后,打印当前行的第1-n个字段
    • awk 'BEGIN{FS=":"}{print $1} /etc/passwd 以冒号(:)为分隔符,打印/etc/passwd的第一个段
  • NF number Field 当前行的字段个数,也就是多少列
    • awk '{print NF}' /etc/passwd
  • NR Number Row 当前行的行号,从1开始计数
  • FNR File Number Row 多文件处理时,每个文件行号单独计数,都是从0开始
  • FS Field Separator 输入字段分隔符。不指定默认以空格或tab键分割
  • RS Row Separator 输入行分隔符。默认回车换行
  • OFS Out Field Separator 输出段分隔符。默认为空格
  • ORS Out Row Separator 输出行分隔符。默认为回车换行
  • FILENAME 处理文件的文件名
  • ARGC 命令行参数个数
  • ARGV 命令行参数数组

awk格式化输出printf

  • %s 打印字符串
    • awk 'BEGIN{FS=":"}{printf "%s\n", $7} /etc/passwd 以字符串格式打印/etc/passwd中的第7个字段,以":"作为分隔符
  • %d 打印十进制数
    • awk 'BEGIN{FS=":"} {printf "%d\n", $3} /etc/passwd 以10进制格式打印/etc/passwd中的第3个字段,以":"作为分隔符
  • %f 打印一个浮点数
    • awk 'BEGIN{FS=":"} {printf "%f\n", $3} /etc/passwd 以浮点数格式打印/etc/passwd中的第3个字段,以":"作为分隔符
  • %x 打印一个十六进制数
    • awk 'BEGIN{FS=":"} {printf "%#x\n", $3} /etc/passwd 以16进制格式打印/etc/passwd中的第3个字段,以":"作为分隔符
  • %o打印八进制数
    • awk 'BEGIN{FS=":"} {printf "%#o\n", $3} /etc/passwd 以8进制格式打印/etc/passwd中的第3个字段,以":"作为分隔符
  • %e 打印数字的科学计数法形式
    • awk 'BEGIN{FS=":"} {printf "%e\n", $3} /etc/passwd 以科学计数法格式打印/etc/passwd中的第3个字段,以":"作为分隔符
  • %c 打印字符的ASCII码

awk修饰符

  • - 左对齐
  • + 右对齐
  • # 显示8进制在前面加0,显示16进制在前面加0x

awk模式匹配

  • 第一种模式匹配:RegExp
    • RegExp 按正则表达式匹配
      • awk 'BEGIN{FS=":"} /root/{print $0}' /etc/passwd
      • awk 'BEGIN{FS=":"} /^yarn/{print $0}' /etc/passwd
  • 第二种模式匹配:关系运算匹配
    • 关系运算符匹配
    • < 小于
      • awk 'BEGIN{FS=":"} $3<50 {print $0}' /etc/passwd
    • > 大于
      • awk 'BEGIN{FS=":"} $3>100 {print $0}' /etc/passwd
    • <= 小于等于
      • awk 'BEGIN{FS=":"} $3<=50 {print $0}' /etc/passwd
    • >= 大于等于
      • awk 'BEGIN{FS=":"} $3>=50 {print $0}' /etc/passwd
    • == 等于
      • awk 'BEGIN{FS=":"} $3==1 {print $0}' /etc/passwd
    • != 不等于
      • awk 'BEGIN{FS=":"} $3!=1 {print $0}' /etc/passwd
    • ~ 匹配正则表达式
      • awk 'BEGIN{FS=":"}$3~/[0-9]{3,} {print $0}' /etc/passwd
    • !~ 不匹配正则表达式
    • 布尔运算符
    • ||
      • awk 'BEGIN{FS=":"} $1=="hdfs" || $1=="yarn" {print $0}' /etc/passwd
    • &&
      • awk 'BEGIN{FS=":"} $3>50 $$ $4<100 {print $0}' /etc/passwd
    • !
      • awk 'BEGIN{FS=":"} $3!=50 {print $0}' /etc/passwd
    • 算数运算符
      • +
      • -
      • *
      • /
      • % 取模
      • ^|** 乘方
      • x++ 在返回变量后,x变量加1
      • ++x 在返回变量前,x变量加1
      • x-- 在返回变量之后,x变量减1
      • --x 在返回遍历之前,x变量减1

awk动作中的条件以及循环语句

语法格式
#  条件判断
if (condition)
{
  commands
} 
else if (condition)
 {
  commands
} 
else 
{
  commands
}

# while循环
while(condition)
  commands

# do while 循环
do
  commands
while(condition)

# for 循环
for(初始化;条件判断;步长)
  commands

# loop.awk
BEGIN {
  while(i<=100)
  {
    sum += i
    i++
  }
  print sum
}

# 调用命令
awk -f loop.awk 
  • awk 'BEGIN{FS=":"}{if ($3>50 && $3<100) print $0}' /etc/passwd

awk字符串函数

  • length(str) 计算字符串长度,返回值整数长度值
  • index(str1, str2) 在str1中查找str2的位置, 返回值为位置索引,从1计数
  • tolower(str) 将str转为小写,返回值为小写字符串
  • toupper(str) 将str转为大写,返回值为大写字符串
  • substr(str,m,n) 从str的m个字符开始,截取n位,返回值为截取后的子串
  • split(str,arr, fs) 按fs切割字符串,结果保存arr中,返回切割后子串的个数
  • match(str,RE) 在str中按照RE查找,返回值为索引位置
  • sub(RE,RepStr,str) 替换查找到的第一个子串
  • gsub(RE,RepStr,str) 替换查找到的所有子串

awk选项

  • -v 参数传递
  • -f 指定脚本文件
  • -F 指定分隔符
  • -V 查看awk的版本号
posted @ 2022-11-08 22:47  phper-liunian  阅读(48)  评论(0编辑  收藏  举报