IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> sed命令和awk命令详解 -> 正文阅读

[开发工具]sed命令和awk命令详解

vim和sed、awk之间的区别:

? ? vim命令是交互式的,sed和awk是非交互式的。比如vim需要i来插入,需要wq来保存退出

? ? vim命令使文件操作模式,sed和awk是行操作模式。

sed命令:

1.sed作用

? ??sed一般用于对文本内容做替换(不一定非用/分割,任意字符都可以):

?? ?? ? 如sed '/usr1/s/usr1/u1/' /etc/passwd

2.sed的模式空间

? ? sed的基本工作方式为:

?? ?? ? 将文件的每一行读取到内存(模式空间)

?? ?? ? 使用sed的每个脚本匹配行,对该行进行操作

?? ?? ? 处理完成后输出该行(同echo输出),没有匹配到就原样输出

3.sed的替换命令s:

? ? -e:使用多个指令,每个指令前都加-e

? ? -i:替换完成后,将得到的内容写回文件中,替换原来的内容

? ? sed 's/old/new/' filename

? ? 示例:

? ??sed -e 's/a/aa/' -e 's/aa/bb/' afile bfile:

?? ??? ?将文件中每一行的首个a变成b,再变成bb,如原文件中内容为a a a,则输出为bb a a

?? ?? ? 简化写法:sed 's/a/aa/;s/aa/bb/' afile bfile

? ??sed -i 's/a/aa/' 's/aa/bb/' afile bfile:

?? ??? ?将文件中每一行的首个a变成b,再变成bb,如原文件中内容为a a a,不输出,将原文

?? ?? ? 件中的内容替换为bb a a

? ? sed 's/...//' afile:

?? ?? ? 将文件中每一行前三个字符替换去掉,放心试,没有加-i不会替换原文件的

? ??sed 's/s*bin//' afile:

?? ?? ? 去掉第一个bin或sbin,s*表示0-n个s

? ? sed 's/^a/b/' afile:

?? ?? ? 将每一行开头的a改为b

4.拓展元字符:

? ??-r:可使用拓展正则表达式,使用拓展元字符必须使用-r

? ? 示例:

?? ?? ? sed -r 's/ab+/!/' afile:

?? ??? ?? ? 将每一行中第一个ab+改为!,b+有1-n个。+为扩展元字符,必须使用-r

?? ?? ? sed -r 's/a|b/!/' afile:

?? ??? ?? ? 将每一行第一个a或b改为!

?? ?? ? sed -r 's/(aa)|(bb)/!/' afile:

?? ??? ?? ? 将每一行第一个aa或bb改为!,不能是sed -r 's/aa|bb/!/',因为识别不了,会被当成

?? ??? ??? ?sed -r 's/a a|b b/!/',意思为将a a或b b改为!

?? ?? ? sed -r 's/.*(login)/\1 \1/' /etc/passwd:

?? ??? ?? ? ()中的内容为一组,\1表示第一组,结果如下:

?? ??? ??? ?root:x:0:0:root:/root:/bin/bash

?? ??? ??? ?login login

?? ??? ??? ?login login

?? ??? ??? ?login login

?? ??? ??? ?login login

?? ??? ??? ?sync:x:5:0:sync:/sbin:/bin/sync

5.替换命令加强版:

? ? 全局替换:

?? ?? ? s/old/new/g,全部替换,并不是只替换第一个,如:? ??

?? ??? ??? ?sed 's/a/b/g' afile: 将每一行中所有的a替换成b

?? ??? ?s/old/new/2,将每一行第二次出现old替换为new,如:? ??

?? ??? ??? ?sed 's/a/b/2' afile: 将每一行中第二次出现的a替换成b

?? ?s/old/new/p afile:

?? ?? ? 没有匹配到old的行不输出

?? ?s/old/new/w afile /usr/local/a.txt:

?? ?? ? 将替换成功的行写入到指定文件中

? ? 寻址:

?? ?? ? 增加寻址后,只对寻址后的行加载然后匹配。

?? ?? ? /正则表达式/s/old/new/g

?? ?? ? 行号s/old/new/g

?? ??? ?? ? 行号可以是具体的行,也可以是最后一行,使用$符号

?? ?? ? 可以使用两种寻址符号,也可以行号和正则混合使用

?? ?? ? 示例:

?? ??? ?? ? sed '/^a/s/a/b/' afile

?? ??? ?? ? sed '1s/a/b/' afile

?? ?? ? 匹配多个命令:/regx/{s/old/new/;s/old/new}

? ? 脚本文件:

?? ?? ? sed -f sedscript filename,将sed命令写到脚本文件中,直接使用

6.sed其他命令

? ? 删除:sed [行号或正则]d

?? ?? ? sed '/ab/d' afile, 删除行中有ab的行,只是在模式空间里的输出变化,原文件不变

? ? 追加、插入、更改:

?? ?? ? sed '/ab/i hello' afile,有ab的上一行插入hello

?? ??? ?sed '/ab/a hello' afile,有ab的下一行插入hello

?? ??? ?sed '/ab/c hello' afile,有ab的行内容替换为hello

? ? 打印命令:p ,sed -n '/ab/p' afile 只打印有ab的行

?? ?打印行号命令:=

? ? 下一行:-n,逐行读取,默认是全部读取

?? ?? ? 打印行号:sed -n = afile

? ? 读文件和写文件:

?? ??? ?sed '/ab/r bfile' afile, 将afile中有ab的行内容与bfile合并

?? ??? ?sed '/ab/w bfile' afile, 将afile中有ab的行写到bfile

? ? 退出命令:q

?? ?? ? 只打印1-10行:

?? ?? ? sed -n '10q' afile (性能更加,只读取前10行)

?? ?? ? sed -n '1,10p' afile

7.sed的多行模式

? ? 为什么要有多行模式:

?? ?? ? 配置文件可能有多行情况,用简单替换无法替换配置文件

? ? N:

?? ?? ? 将下一行加入到模式空间

?? ?? ? sed 'N;s/hel\nlo/!!!/' a.text 或?sed 'N;s/.*/!!!/' a.text

?? ?? ? a.text内容如下:

?? ??? ?? ? hel

?? ??? ?? ? lo

? ? D:

?? ?? ? 删除模式空间中的第一个自读到第一个换行符

? ? P:

?? ?? ? 打印模式空间中的第一个字符到第一个换行符

8.保持空间

? ? 保持孔家你也是多行的一种操作方式

? ? 将内容暂存在保存空间,便于做多行处理

? ? 流程: 文本文件 -> 模式空间 -> 保持空间

? ? h和H将模式空间内容放到保持空间,小写是覆盖,大写是追加

? ? g和G将保持空间内容放到模式空间,小写是覆盖,大写是追加

? ? x交换保持空间和模式空间

? ? 示例:

?? ?? ? 将文件内容倒序输出: sed -n '1h;1!G;$!x;$p' file

?? ?? ? 过程:拿纸推导吧

awk命令:

1.awk作用

? ? awk一般用于文本内容进行统计、按需要的格式进行输出,例如:

? ? ? ? 完整格式:'BEGIN{...}{}END{...}'

?? ?? ? 示例:

?? ??? ?cut写法:cut -d : -f 1 /etc/passwd

?? ?? ? awk写法:awk -F: '/wd$/{print $1}' /etc/passwd

2.awk的字段和使用

? ? 每行成为awk的记录

? ? 使用空格、制表符分隔开的单词称作字段

? ? 字段引用:

?? ?? ? awk中使用$1 $2 ... $n 表示每一个字段, $0为全部,与shell中$0是文件名不同

?? ?? ? NF表示总个数

?? ?

? ? 字段分割:

?? ??? ?awk可以使用-F选项改变字段分隔符(可以用正则):

?? ??? ??? ?awk -F',' '{print $0}' afile

? ? 行匹配:

?? ??? ?awk脚本开头可以用/regx/匹配行:

?? ?? ? ?? ?awk '/^a/{print $0}' afile:打印a开头的行

?? ??? ?

?? ?示例,有如下文件,打印文件中以menu开头的行中操作系统类型,并显示序号:

?? ??? ??? ?menu 'windows'

?? ??? ?? ? 1234

?? ??? ??? ?menu 'linux'

?? ??? ?? ? abc

?? ??? ??? ?menu 'mac'

?? ??? ?答案: awk -F"'" '/^menu/{print x++,$2}' afile

3.判断和循环

? ? if语句:

?? ?? ? if(表达式){语句}else{语句}

?? ?? ? 示例:

?? ??? ??? ?echo 1 2 3 | awk '{if($2>$3){print 1}else{print 0}}'

? ? while循环:

?? ?? ? while(表达式){语句}

? ? do while循环:

?? ?? ? do{语句}while(表达式)

? ? for循环:

?? ?? ? 打印0-9:

? ? ?? ?? ??echo : | awk '{for(i=0;i<10;i++){print i}}'

?? ?? ? 打印每个参数:

?? ??? ??? ?echo 1 2 3 | awk '{for(i=1;i<=NF;i++){print $i}}'

?? ?? ? 打印参数的总和:

?? ??? ??? ?echo 1 2 3 | awk '{sum=0;for(i=1;i<=NF;i++){sum+=$i};print sum}'

? ? break和continue和其他语言相同

4.awk数组

? ? 数组的定义:

?? ?? ? 数组名称[下标]=值

? ? ?? ??? ?下标可以用数字或字符串,实际上数字也会被存为字符串

? ? 数组的遍历

?? ?? ? for(变量 in 数组名称)

? ? 数组的删除

?? ?? ? delete 数组名称

?? ?? ? delete 数组名称[下标]? ??

? ? 示例:

?? ?? ??echo 1 2 3 | awk '{for(i=1;i<=NF;i++){arr[i]=$i}}END{for(ele in arr)?

?? ??? ?print?ele, arr[ele]}'

? ? 命令行参数数组:

?? ?? ? ARGC 参数个数

?? ?? ? ARGV 参数数组,ARGV[0] 表示命令名称,这里是awk

?? ?? ? 示例:

?? ??? ?? ? 创建arg.awk文件,内容:BEGIN{for(i=0;i<ARGC;i++){print ARGV[i]}}

?? ??? ??? ?awk -f arg.awk 11 22 33,结果:

?? ??? ??? ??? ?awk

?? ??? ??? ??? ?11

?? ??? ??? ??? ?22

?? ??? ??? ??? ?33

5.awk函数

? ? 算数函数:

?? ?? ? sin() cos()

?? ?? ? int()

?? ?? ? rand():获取随机数[0,1),重复执行是一样的值

?? ??? ?srand()重新获取种子,每次rand()前先使用srand();

? ? 字符串函数:

?? ?? ? 以下函数可以用man awk | less,搜索看其含义

?? ?? ? gsub(r,s,t)

?? ?? ? index(s,t)

?? ?? ? length(s)

?? ?? ? match(s,r)

?? ?? ? split(s,a,sep)

?? ?? ? sub(r,s,t)

?? ?? ? substr(s,p,n)

? ? 自定义函数:

?? ?? ? function 函数名(参数){

?? ??? ?? ? 语句

?? ??? ?? ? return 返回值

?? ??? ?}

?? ?? ? 需要定义在BEGIN之前,示例:

?? ?? ? awk 'function a(num){ return num } BEGIN{print a(0)}'

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:35:43  更:2022-03-03 16:37:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:37:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码