每日励志:做了才有机会说期待
sed
命令选项使用
动作之间用;隔开 H剪切,g覆盖复制,G复制到行下,$G最后一行,w另存
a下一行追加,i插入,d删除,c选定行替换,p打印,s替换指定字符,y字符转换
示例:
文本打印
sed -n "7p" #第七行
sed -n "7p;10p" #7和10行
sed -n "7,10p" #7到10行
sed -n "/^A/ p" #以A开头正则放在//中 ,p为打印
sed -n "/p;n/" #奇数行
sed -n "/n;p/" #偶数行
sed -n "5,10{n;p}" #5到10行之间的偶数行
sed -n "5,${n;p}" #5到最后一行
sed -n "4,/the/p" #从第四行到第一个包含the的行
sed -n "4,/the/=" #从第四行到第一个包含the的行,打印行号
sed -n '$=' ip.sh #统计行号
sed -n "/^[a-z]/d" #删除以任意字母开头的行
sed -n "/^$/d" #删除空行
sed -n '/[^$]/p' #去除空行
sed -n 's/[[:space:]]/\n/g'p #把空格替换成换行
sed -n '/23\/Sep\/2022:06:20:*/, /23\/Sep\/2022:06:24:*/p' /var/log/nginx/access.log #查看特定时间段内日志
文本替换
sed 's/^[ ]*//g' 1.txt | wc -c #删除文件中所有的空格,wc -c统计字符个数
sed 's/the/THE/' #将每行中的第一个the替换成大写THE
sed 's/l/L/2' #将每行中的第二个l替换成大写L
sed 's/the/THE/g' #将所有行的the替换成THE
sed 's/o//g' #将所有行的o替换为空
sed 's/^/#/' #在每行行首插入#号
sed '/the/s/^/#/' #在包含the的每行行首插入#
sed 's/$/EOF/' #每行行尾插入字符串EOF
sed '3,5s/the/THE/g' #将3到5行中的所有the替换为THE
sed '/the/s/o/O/g' #将包含the的所有行中的o都替换成O
cat -n test.txt | sed '1,2H;17g' #将1,2行复制到第17行,17行被覆盖
cat -n test.txt | sed '1,2H;17G' #将1,2行复制到第17行下面
cat -n test.txt | sed '1,2{H;d};$G' #将1,2行剪切到最后一行下
sed -n '5,10w 1.txt' test.txt #将test.txt的5到10行另存到1.txt
sed '1a33333' test.txt #在第一行下加入33333
sed '1i33333' test.txt #在第一行上面插入33333
sed '1c44444' test.txt #第一行替换为44444
sed '/^[ ]*$/d' #删除纯空行和由空格组成的空行
#修改文件不加p打印,如果加p打印会出现两行相同
sed -i 's/.*spring.datasource.url.*/spring.datasource.url=jdbc:mysql:\/\/localhost:3306\/my_terminal?serverTimezone=GMT%2B8\&useSSL=false/' ROOT/WEB-INF/classes/application.properties #匹配替换整行内容
sed '1,6s/INFO/ALL/g' log4j.properties #修改文件1到6行中的INFO为ALL
sed -i ‘/SELINUX/s/disabled/enforcing/’ /etc/selinux/config #找到SELINUX行,把后面的enforcing替换成disabled
修改tomcat配置文件
\/代表转义,让目录正常匹配
sed -n '/^3manager/'p ../conf/logging.properties #匹配以3manager开头的行
sed -i '/^3manager/s/^/#/' /opt/apache-tomcat-8.5.47/conf/logging.properties #匹配以3manager开头的行开头加注释
sed -n '/^\#3manager/p' /opt/apache-tomcat-8.5.47/conf/logging.properties #匹配以#3manager开头的行(相当于匹配注释行)
sed -n '/^\#3manager/s/^#//g'p /opt/apache-tomcat-8.5.47/conf/logging.properties 打印以#3manager开头的行并取消开头#号注释
sed -i '/^\#3manager/s/^#//g' /opt/apache-tomcat-8.5.47/conf/logging.properties #同上直接修改
sed -i 's|server.port=8080|server.port=8085|' /opt/apache-tomcat-8.5.47/webapps/ROOT/WEB-INF/classes/application.properties #修改默认端口
sed -i '/PRGDIR=`dirname "$PRG"`/a\CATALINA_PID=/var/run/tomcat.pid' /usr/local/tomcat/bin/catalina.sh #配置文件中匹配某一行PRGDIR=`dirname "$PRG"`在下一行插入内容CATALINA_PID=/var/run/tomcat.pid
sed -i '$a export REDIS_HOME=\/usr\/local\/redis\nexport PATH=$PATH:$REDIS_HOME\/bin' /etc/profile #在/etc/profile中添加redis的两行环境变量
grep
grep命令选项
-r 递归查找,包含子目录
-I 不区分大小写
-v 反转查找
-n 显示行号
-E 支持扩展(和egrep效果相同)
-o 只把通配的字符输出
-q 静默执行,不输出结果
-w 识别为单词(单词完全匹配)
-c 统计匹配的行数
-A 打印以文本结尾的NUM行
-B 打印以文本起始的NUM行
grep -Evn "^$|^#" /usr/local/redis/redis.conf #过滤空行,注释行
grep -nr "warning" node.yml #查找文件中特定内容,带行号显示
grep -nr -a3 "warning" node.yml #查找文件中特定内容,显示查找内容的上下三行
grep -e "87600|auth" ca-config.json #匹配包含87600和auth的行
grep -Hrn :90 ./ #目录下包括子目录查找包含特定内容的文件
grep '23/Sep/2022:06:*:[0-59]' /var/log/nginx/access.log #查看特定时间段日志
awk
用法:awk 选项
‘模式或条件 {编辑指令}’ 文件1 文件2 …//过滤兵输出文件符合条件的内容
awk ‘BEGIN{FS=“:”};END{print}’ 文件名 指定:为分隔符
一,内置变量
FS: 指定每行文本的字段分隔符,缺省默认为空格或制表位(tab)
NF:当前处理的行的字段个数(列数)
NR:当前处理的行的序数(行数)
FILENAME:awk浏览的文件名
$0:当前处理的行的整行内容
$n:当前处理的第n个字段(第n列)
RS:输入记录分隔符(输入换行符),指定输入时的换行符
二,命令选项
awk -v #将变量传入到awk中
例:
device=ens34
LOCAL_IP=`ifconfig $device | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sed -n '1p'`
#输出结果为脚本中你想要使用的网卡的ip
hostnamectl set-hostname $(awk -v ip=$LOCAL_IP '{if($1==ip && $2 !~ "kubeapi")print $2}' /etc/hosts)
#根据你指定的网卡ip按照hosts的记录去修改主机名
#计算用户UID,输出总和,平均数
cat /etc/passwd | awk -F":" '{sum+=$3}; END {print sum} END {print int(sum/NR)}'
#打印密码为空的用户
awk -F: '$2=="" {print $0}' /etc/shadow
#打印最后一列最后一行
cat test001.txt | sed -n '$p' | awk '{print $NF}'
#统计行数
awk 'END{print NR}' ip.sh
#统计次数查询历史命令中使用最多的五条命令
history | awk '{print $2}' | sort | uniq -c | sort -nr | head -5
#打印第三行倒数第二列
vmstat | awk 'NR ==3{print $(NF -2)}'
打印docker镜像名称标签,:连接
docker images | awk {'print $1":"$2'}
扩展知识
uniq
单命令用于去除重复的行
-c:在行首用数字表示该行出现了多少次
-u:仅仅显示那些没有出现重复过的行
-i:忽略大小写
-d:只显示重复行sort
单命令默认用于行首以升序排序
-u :去除重复行
-r :行首以降序排列,默认是升序
-o : 将排序结果输出到文件中,类似重定向符号>
-n :以数值大小排序,默认是按字符排序
-t :分隔符
-k :第N列
-b :忽略前导空格。
-R :随机排序,每次运行的结果均不同
Xargs
如果 命令不支持|管道来传递参数使用xargs作用相同