首页 > 系统相关 >shell-文本处理学习笔记

shell-文本处理学习笔记

时间:2022-11-08 22:55:58浏览次数:46  
标签:shell 匹配 passwd 笔记 文本处理 etc sed awk file

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的版本号

标签:shell,匹配,passwd,笔记,文本处理,etc,sed,awk,file
From: https://www.cnblogs.com/simple-record/p/16861716.html

相关文章

  • Spring+SpringMVC学习笔记
    Spring学习笔记转载:https://www.yuque.com/kkuping/yuqzh2/vlgfylSpringMVC学习笔记转载:https://www.yuque.com/kkuping/yuqzh2/nxtocy......
  • c语言提高学习笔记——03-c提高10day_数据结构
    在学习c语言提高-数据结构总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。03-c提高10day_数据结构目录:一、队列(Queue)1、队列基本概念2......
  • shell脚本,创建新用户并判断该用户是否存在
    如果输入的用户账户名已经存在。则输出提示“输入的用户账户名已经存在”,并结束程序,反之,则要求输入用户密码,并创建该用户。#!/bin/bashecho"正在创建一个用户账户……"......
  • Redis笔记
    概述Redis是一个内存数据库,也就是指存储到内存条上的数据,而MySQL是一个外存数据库,将数据库存储在硬盘(外存)中一、Linux安装下载完毕后,解压压缩包(自己找目录)tar-zxv......
  • 离散数学笔记-- 谓词
    基本概念:  看下面的小例子: 特性谓词,拓展定义域的时候: 看看就行: 具体展开:    具体应用3步骤:   一些逻辑变化:  仔细看下面的例......
  • UE4学习笔记16——【蓝图】冲刺;瞬移;多段跳
    P48.冲刺、瞬移、多段跳P48打开小白人的蓝图类,新建图表命名为“冲刺和瞬移”点一下组件中的“角色移动”,把细节中的“最大行走速度”改成93  添加节点“......
  • 【HDLBits刷题笔记】17 Verification: Wrting Testbenches&CS450
    Tb/clock这题要求给dut模块一个时钟。moduletop_module();regclk;always#5clk=~clk;initialbeginclk=0;enddutu0(clk);......
  • MFC学习笔记——07-MFC_19day
    在学习MFC总结了笔记,并分享出来。07-MFC_19day  一、基于对话框编程 (1)基于对话框编程对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。在Vis......
  • 离散数学笔记
    特别注意:常元和变元  下面的栗子看看就行了:注意:永真和永假式:(重言和矛盾)栗子:    真值表的2个应用: 1判断永真 2判断式子是否等价:  ......
  • Shell脚本入门全套教程
    1、> 输出正确的输出 -覆盖  2> 输出错误的输出 -覆盖  &> 输出正常和错误的信息-覆盖  >> 追加   grep过滤数据  clear清频幕  vim ......