linux下的shell命令学习笔记008
# --------------------------------
# sed 工具
#-n (安静模式)仅仅sed特殊处理的那一行才显示
#-r 动作支持扩展正则表达式(默认是基础正则表达式)
#-i 直接修改文件内容,而不是由屏幕输出
# 动作说明:直接举例说明吧
cat -n main.c | sed -n '5,12p' #将main.c中的5-12行输出
cat -n main.c | sed '5,12d' | less #将main.c中的5-12行删除
nl main.c | sed '2a #include<stdlib.h>' #在mian.c第2行之后添加#incude...
# 以上例子仅仅打印在屏幕上,并没有写入文件
# 下面这个是直接修改文件,注意别直接用来修改系统文件,太危险了
sed '1a #include<stdlib.h>' -i main.c #实际写入了文件
# 动作介绍:
# a 追加
# c 替换 nl main.c | sed '3c //Hello world!'
# d 删除
# i 插入
# p 打印
# s 替换,直接进行替换工作,并且可以配合正则表达式
# 1,20s/old/new/h #该命令可以类比rename的操作
# --------------------------------
# printf 格式化输出
printf 's\ts\ts\n' $(cat 1.txt)
# printf 不是管道命令,因此需要$(cat 1.txt)
printf 'str = \x41\x30\n'
# 直接输出字符: str = A0回车
printf 'num=%d\n' 125
# 输出:num=125
# 我觉得printf可以类比c中的printf(当然并非完全一样,但可类比)
# --------------------------------
# awk 常用于将行分段处理
# sed 常用语行处理
#
# 简单解释该命令:NR是个变量,表示awk所处理的是第几行的数据
last -4 | awk '{print "line_cnt=" NR "\t" $1 "\t" $3 }'
# 看下面的命令,理解吗?(注意逻辑判断的用法)
ls -al| awk '$5 > 1024 {print $1 "\t" $9}'
# awk特殊的地方,变量不必使用$
# --------------------------------
# diff 常用于同一个文件的新旧版本比较
# [特点]以行进行比较
# 举例:
cat 1.txt > 2.txt
sed -i '4,12d' 2.txt
sed -i '1a wjf' 2.txt
sed -i '7c AAABBBCCC' 2.txt
diff 1.txt 2.txt
# --------------------------------
# cmp
# [特点]以字节进行比较
# 相对与diff而言,用的较少
# --------------------------------
# patch 该命令和diff密不可分
# ---> 升级
# 举例:
diff -Naur 1.txt 2.txt > txt.patch
cat txt.patch | grep '^[+-]*'
# 我的理解:
# --- 代表旧文件
# +++ 代表新文件
# + 代表新增
# - 代表删除
#用补丁将旧文件1.txt更新
patch -p0 < txt.patch
#用补丁对更新后的1.txt进行还原
patch -R -p0 < txt.patch
#patch 详解解释:
patch -pN < patchfile
patch -R -pN < patchfile
#参数说明:
#-p 后面紧跟的N表示取消几层目录的含义
#-R 代表还原,将更新后的文件还原为旧版本