一 、 把/etc/profile文件下的 export JAVA_HOME 这个开头的 这一句 提到 catalina.sh 的#!/bin/sh 下一行下面
大佬解答: (学到了数组)
下图的方式,这样会有问题,插入的时候因为空格问题,后面部分会提示错误,用数组就可以解决空格问题
变成这样了,export 后面的就没有了。 所以用数组
写法:
java_path=(`grep -E "^export JAVA_HOME.*" /etc/profile`)
echo ${java_path[*]}
sed -r '/#!\/bin\/bash/a'${java_path[0]}' '${java_path[1]}'' catalina.sh
二、使用sed精确匹配出*.pem的名称进行替换
s@/.*?.pem@新内容@
echo 'a/b/c.pem' | sed 's@/[^/]*.pem@/new@'
三、 取day值
line="/DATA/PUBLIC/SAVENER/ETL/ETL_SE_PM_LTE_CEL_ALL/province_id=811/day=20200721/hour=2020072123/811_20200721230000_20200722010201_01.txt"
1、 grep -oP '(?<=day=).*?(?=/)' 1.txt
2、 sed -r 's#.*(day=)([0-9]+)(/.*)#\2#' 1.txt
3、 sed -r 's#.*day=([^/]+).*#\1#' 1.txt
值得注意的是sed, 两则的 .* 不是随便写的,如果两则没有.* 则他\1输出的结果是全行
后面的[^/]+是贪婪模式下是个不错的固定技巧
四、awk取非#开头的Ip
192.168.1.99 root 22
192.168.1.100 root 22
#192.168.1.101 root 22
192.168.1.102 root 22
#192.168.1.99# root# 22
#
awk '{/^[^#]/print $1}' host.info
^[^#]第一个^是锚点(断言) , 也是零宽断言
(因为#号后面的字符可以跟[^#]匹配啊,所以加个锚点,加个锚点才是匹配指定位置的)
五、如何取出 name 1{} 大括号里的所有字符
cat file
r0{
name 1{
volume 0{
disk /dev/sdb;
}
address 192.168.1.101:7788;
}
name 2{
...
}
}
1、awk
awk '/name 1/,/}/' file
awk 'NR>2{print line}{line=$0}' a.txt
2、sed
sed -n '/name 1/,/name 2/p' a | sed '/name/d' | sed '$d'
3、perl 1
4、awk 2
5、 grep
一次读入所有文本,开启单行模式,使"."能匹配所有,用前向否定环视来给.做限制。大概就是这样。
6、grep 2
递归法
7、perl 2
8、awk
六、取红色方框里的内容,应用用awk print 几就可以了
1、awk
ll --full-time | awk -F '[ .]' '{print $5,$6,$7}'
将空格和.号作为分隔
2、cut
ls -l --full-time | cut -d . -f 1 | cut -d " " -f 5,6,7
3、grep
ll --full-time | grep -Po '\d+\s+\d{4}[^.]+'
先在匹配一小部分,然后用[^.]+ 匹配
后面的[^.]+是贪婪模式下是个不错的固定技巧
以前也用到这个方法技巧