| |
|
开发:
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)}' |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |