相当好用的sed和awk工具

sed本身是管道命令,这里主要讲对数据的替换,删除,新增,选取特定行的功能介绍,书本就将这么多哈

上案例

1)nl /etc/passwd | sed '2,5d' #删除文件的2到5行

sed [n1,[n2]] function

其中function 参数如下

a 新增 c替换 d 删除 i 插入 p打印 s替换 ,格式为 's\old\new\g'

sed 接动作需要用 单引号,一个动作的时候 -e可以忽略,多个动作不可以忽略

2)nl /etc/passwd|sed '2a drink tea' #文件第二行增加字符串 drink tea,注意是追加

如果在前面,则换成2i,如果增加多行则需要用\来分割,可以自己尝试下

3)nl /etc/passwd |sed '2,5c No 2-5 number' #替换2-5行内容为 No 2-5 number

4)昨天的例子,取出文件第11到20行,head -n 20|tail -n 10,用sed就非常简单了

nl /etc/passwd | sed -n '11,20p'#不加n会输出很多,不知道为啥,有了解的希望私信或留言哈

5)找到IP

/sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

#分段解释第一段,显示本机网络信息

第二段,找到inet addr相关的记录行

第三段和第四段 :替换尾部是addr:的字符串,Bcast开头的字符串到结尾,就是ip地址的前后部分替换成空格的意思

总之写命令sed时候可以逐步分析操作,这样比较清晰

扩展正则表达式不讲了,等用到时候再说吧

二 格式化打印:printf这个最熟悉不过了,以前学习c语言的时候也是这个,上案例

print '%s\t %s\t' $(cat printf.txt),#格式化输出

字符串1 tab键 字符串2

其中s表示字符串,i表示integer ,N.nf表示长度N,小数点后n位小数,小数点算一位

%ns %ni 可以设置固定长度来格式化输出数据

print '%5s\t %10i' $(cat printf.txt) 长度为5的字符串,长度为10的整数

突然想到:今天用alias 设置别名,发现取值需要(var)才可以,不是{var},大家可以尝试下

第二个工具 :awk 这个按字段处理,sed按行处理,话不多说,就是实践,这玩意学理论困的要死

awk '条件1{}动作1} 条件2 {}动作2}..' filename #格式,注意动作在{动作} 也是用单引号

last -n 5 #显示登录信息最近的5条记录

last -n 5 |awk '{printf $1 "\t" $3}' #文件中第一列字段和第三列字段格式化输出,中间用tab分隔

有几个内置参数 NF 每行总字段数 $0表示一整行数据,字段1用$1表示,以此类推

NR当前处理行 FS目前的分隔符 默认是空格,案例

last -n 5|awk '{printf $1 "\t lines:" NR "\t columes:"NF}'#字段信息,第一列,lines当前处理行,col总列数

2) awk的逻辑运算 > >= < <= != 上面的案例都是对显示的所有行操作,所以没有条件限制,限制的在这里,利用逻辑运算符控制

cat /etc/passwd | awk '{FS=":"} $3<10 {printf $1 "\t" $3}'#文件已冒号分割,输出第三列数值小于10的记录,边打印出出 第一,三列的记录

注意:这里不包含第一行,如果设置,需要写这个'BEGIN {FS=":"}'

案例 ,字段列2,3,4,求和显示 ,1列是姓名,增加列total 第一行显示类别不累加,和表格一样

cat pay.txt | awk 'NR==1 {printf "%s\t '%s\t %s\t %s\t %s\t\n",$1,$2,$3,$4,"Total"}

NR>=2 {total=$2+$3+$4

printf "%10s %10d %10d %10d %10d\n",$1,$2,$3,$4,total)'

注意:在bash,shell中,变量取值直接用名字就行,不用$符号

意思:文件行数为第一行时,打印输出标题,末尾增加列Total

行数大于等于2的时候,打印出各字段内容,并将2,3,4求和给total列显示出来

最近正则表示的学习,如果纯理论真是不好研究,平时多多积累练习才能了解。

第三:文件比较工作,案例是,找出新旧文件不同,生成补丁文件,更新和还原操作,多用于更新源文件的变更,不同的文件比较意义不大,比如生产配置文件的更新,补丁更新等

diff 和 cmp

首选创建一个文件passwd.old

然后坐下简单的修改

cat passwd.old | sed -e '4d' -e '6c no six line' >passwd.new

这里sed超过2个动作时候需要参数e,之前就一个动作,可以不加,刚刚介绍了,这里有数据流定向,将结果写入到passwd.new文件里面,删除第四行,替换第6行

可以利用diff passwd.old passwd.new来看下结果,会显示出更改的地方

这个文件先放这里,一会用

2)cmp比较,主要利用字节去比较,没有diff用途广泛,

可以 cmp passwd.old passwd.new看下结果,不过多介绍了,重点来了

patch 命令,他和diff相关,切极为密切,制作补丁文件,更新和还原在这里,直接上

制作补丁

diff -Naur passwd.old passwd.new >passwd.patch

#把两个文件的改动地方显示出来并记录到passwd.patch文件里面,小白的理解就是word有个审阅的功能,生成的文件类似审阅时候的文档(被修改过的会标记出来),可以同意更改,也可以不同意更改还原。这就是补丁文件

更新

patch -p0 <passwd.patch

还原

patch -R -p0 <passwd.patch

-pN中N表示取消基层目录的意思,同一目录不需要减掉了

-R还原

新文件我们可以根据时间命名,这样以后如果想要恢复某个时间段的配置文件信息,方便查找,利用补丁文件,很简单的就可以还原啦,好了,睡觉了,明天见

相关推荐
颇有几分姿色6 分钟前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
光芒再现dev24 分钟前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
AndyFrank37 分钟前
mac crontab 不能使用问题简记
linux·运维·macos
筱源源1 小时前
Kafka-linux环境部署
linux·kafka
EricWang13581 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
成都古河云1 小时前
智慧场馆:安全、节能与智能化管理的未来
大数据·运维·人工智能·安全·智慧城市
算法与编程之美2 小时前
文件的写入与读取
linux·运维·服务器
xianwu5432 小时前
反向代理模块
linux·开发语言·网络·git
Amelio_Ming2 小时前
Permissions 0755 for ‘/etc/ssh/ssh_host_rsa_key‘ are too open.问题解决
linux·运维·ssh
心灵彼岸-诗和远方2 小时前
Devops业务价值流:软件研发最佳实践
运维·产品经理·devops