龙空技术网

Linux基础15-linux三剑客之sed|awk最简单的教程(连载中)

运维阿文 2401

前言:

当前大家对“oracle spool 换行符”大约比较注意,小伙伴们都需要分析一些“oracle spool 换行符”的相关文章。那么小编在网上网罗了一些对于“oracle spool 换行符””的相关内容,希望咱们能喜欢,大家一起来学习一下吧!

linux三剑客分别是grep,awk,sed这个三个工具在linux当中是最常用的在linux/unix下对文本和数据进行编辑和处理,在处理的工具当中我们单独掌握一种工具往往不太方便,所以这边给大家介绍2个稍微难一些的工具.

sed的用法

sed(stream editor)是流编辑器,可对文本文件和标准输入进行编辑。

sed只是对缓冲区中原始文件的副本进行编辑,并不编辑原始的文件,如果需要保存改动内容,可以选择使用下面两种方法:

重定向

w编辑命令 -i 选项

sed基本格式

sed option 'script' file1 file2 ...sed option -f scriptfile file1 file2 ...

选项含义:

--version 显示sed版本。--help 显示帮助文档。-n,--quiet,--silent 静默输出,默认情况下,sed程序在所有的脚本指令执行完毕后,将自动打印模式空间中的内容,这些选项可以屏蔽自动打印。-e script 允许多个脚本指令被执行。-f script-file,--file=script-file 从文件中读取脚本指令,对编写自动脚本程序来说很棒!-i,--in-place 直接修改源文件,经过脚本指令处理后的内容将被输出至源文件(源文件被修改)慎用!-l N, --line-length=N 该选项指定l指令可以输出的行长度,l指令用于输出非打印字符。--posix 禁用GNU sed扩展功能。-r, --regexp-extended 在脚本指令中使用扩展正则表达式-s, --separate 默认情况下,sed将把命令行指定的多个文件名作为一个长的连续的输入流。而GNU sed则允许把他们当作单独的文件,这样如正则表达式则不进行跨文件匹配。-u, --unbuffered 最低限度的缓存输入与输出。

以上仅是sed程序本身的选项功能说明,至于具体的脚本指令(即对文件内容做的操作)后面我们会详细描述.

sed的语法:sed '样式命令'文件

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。(通过非交互式来修改文本中的内容)

意思是 如果文件中的某一行符合样式,就执行指定的sed命令 如删除(d)替换是(s)

“样式”使用一对//含括,表示寻找的意思。也可以指定数据行的范围:如1,6

注意 sed不加"-i"的情况下是不修改文件内容的 只是读取文件的内容 >>

p 打印匹配行= 打印文件行号a\ 在定位行号之后追加文本信息i\ 在定位行号之前插入文本信息d 删除定位行c\ 用新文本替换定位文本s 使用替换模式替换相应模式r 从另一个文件中读文本w 将文本写入到一个文件y 变换字符q 第一个模式匹配完成后退出l 显示与八进制ASCII代码等价的控制字符{} 在定位行执行的命令组n 读取下一个输入行,用下一个命令处理新的行h 将模式缓冲区文本拷贝到保持缓冲区H 将模式缓冲区文本追加到保持缓冲区x 互换模式缓冲区和保持缓冲区内容g 将保持缓冲区内容拷贝到模式缓冲区G 将保持缓冲区内容追加到模式缓冲区g 与s使用表示全局匹配替换 p 打印匹配行 s 替换 -n 取消默认输出 -e 允许多项编辑 -i 修改原文件

sed基本用法

sed删除用法sed ‘1,4d’dataf1 #把第一行到第四行删除,并且显示剩下的内容 sed ‘/La/d’dataf2 #把含有La的行删除 sed '/La/!d' dataf2 #把不含La的行删除,!是否定的意思 sed ‘/[0-9]\{3\}/d’dataf3#把有”3位数”的行删除sed sed '/^$/d' dataf5 #删除空行 sed 显示用法 sed -n '/La/p' dataf2#显示含有La的行 sed 替换用法(把-n 换成-i 就是直接替换原文件了) sed -n 's/La/Oo/p' dataf2 #把La替换为Oo-n是抑制sed显示其他行 sed -n 's/La//p' dataf2 #把La替换为空 sed -n 's/La/Oo/gp' dataf2 #加g是全局替换的意思 sed -n 's/^...//p' dataf2 #把每行开头的3个字符替换为空 sed -n 's/...$//p' dataf2 #把每行结尾的3个字符替换为空 sed -n 's/La/10o/p' dataf2 #替换 sed -n '/AAA/s/234/567/p' dataf6#找到含有AAA的行,然后把234替换成567 sed -n '/AAA/,/DDD/s/B/567/p' dataf7#找到含有AAA到DDD的那几行,将B替换成567 sed -n '/AAA/,/DDD/s/B/567/gp' dataf7 #全局sed -n "/^[[:space:]]*Port/cPort 22" /etc/ssh/sshd_config 修改ssh连接端口

awk的用法

awk是一种编程语言,软件级别等同于bash,主要用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,默认从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。

awk的工作方式是读取数据文件,将每行数据视为一条记录,每笔记录以字段分隔成若干个字段,然后输出各个字段的值

awk比sed强的地方在于不仅能以行为单位还能以列为单位处理文件。awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格和Tab,但是行分隔符和列分隔符都可以自定义,比如/etc/passwd文件的每一行有若干个字段,字段之间以:分隔,就可以重新定义awk的列分隔符为:并以列为单位处理这个文件

awk的常用格式

awk "样式" 文件 : 把符合样式的数据行显示出来 awk '{操作}' 文件: 对每一行都执行{}中的操作 awk '样式{操作}' 文件: 对符合样式的数据行,执行{}中的操作 1)命令模式 awk [options] 'commands' file(s) command 部分:/范围说明/{awk命令语句1;awk命令语句2;} 范围说明部分可以是BEGIN、END、逻辑表达式或者为空 awk命令语句间用分号间隔 引用shell 变量需用双引号引起 option 部分 -F 定义字段分割符号2)脚本模式 awk [options] -f scriptfile file(s) 特点: awk脚本是awk命令的清单 命令需要用分号间隔 #号开头的是注释行 # /bin/awk -f
变量名属性$0当前记录$1~$n当前记录的第N个字段FS输入字段分隔符默认是空格RS输入记录分割符,默认为换行符NF当前记录中的字段个数,就是有多少列NR以及读出的记录数,就是行号,从1开始OFS输出字段分隔符 默认也是空格ORS输出的记录分隔符 默认为换行符

awk的示例

取倒数第一列和倒数第二列$ head -1 passwd |awk -F':' '{print $NF,$(NF-1)}'/bin/bash /root换行符(默认处理一行后才换行)$ head -1 passwd |awk -F':' '{print $NF RS $(NF-1)}'/bin/bash/root$head -1 passwd | awk 'BEGIN {FS=":"} {print $NF RS $(NF-1)}'一次指定多个分隔符$ awk -F':|/' '{print NF}' passwd$ awk -F'[:/]' '{print NF}' passwd$ ifconfig eth0|grep Bcast|awk -F':| +' '{print $4}'$ifconfig eth0 |grep Bcast | awk -F" " '{print $2}'|awk -F":" '{print $2}'打印标题和结尾信息$ awk -F':' 'BEGIN {print "user\tpasswd\thome"RS"----------------------"} ; {print $1"\t"$2"\t"$(NF-1)} ; END {print "<-----------END---------->"}' passwduser passwd home----------------------root x /rootbin x /bindaemon x /sbinadm x /var/admlp x /var/spool/lpd<-----------END---------->正则表达式awk '/La/' dataf3 #显示含有La的数据行 awk '{print $1, $2}' dataf3 #显示dataf3每一行的第一个和第二个字段 awk ‘/La/{print $1, $2}’ dataf3#将含有关键词La的数据行的第1和第2个字段显示 awk -F: '/^ceshi/{print $3, $4}' /etc/passwd #用-F指定:为分隔符,账号ols3的第三段和第四段显示 awk -F: 'BEGIN{OFS="+++"}/^mail/{print $1, $2, $3, $4, $5, $6, $7}' /etc/passwdOFS的作用是存储输出字段的分隔符 awk应用 取网卡的IP地址 ifconfig |sed -n '2p' |awk -F: '{print $2}' |awk '{print $1}'取网络设备的名称: cat /proc/net/dev/sed -n '4p'|awk -F: '{print $1}' 取系统内存大小 cat /proc/meminfo |awk '/MemTotal/{print $1,$2}'cat /proc/meminfo |sed -n '1p'用netstat -ntl 截取所有开放的端口号netstat -ntl |grep -v Active| grep -v Proto|awk '{print $4}'|awk -F: '{print $NF}'netstat -ntlup |grep -Ev "Active|Proto" |awk '{print $4}' |awk -F: '{print $NF}'awk流程控制if# awk -F: '{if($3>500) print $1,$3,"普通用户"}' /etc/passwd# awk -F: '{if($3>500) print $1,$3,"普通用户";else print $1,$3,"不是普通用户"}' /etc/passwd# awk -F: '{if($3==0) print $1,$3,"管理员";else if($3<500) print $1,$3,"系统用户";else print $1,$3,"普通用户"}' /etc/passwdfor# awk 'BEGIN {for(i=0; i<=10; i++) print i}'while# awk 'BEGIN {i=0;while(i<=5) {print i;i++}}'# awk 'BEGIN {i=0;while(i<=5) {print"service",i,"start";i++}}'#循环的控制:break --条件满足的时候中断循环continue --条件满足的时候跳过循环# awk 'BEGIN {i=0;while(i<=5) {i++;if(i==3) continue; print i}}'# awk 'BEGIN {i=0;while(i<=5) {i++;if(i==3) break; print i}}

linux+zabbix

标签: #oracle spool 换行符