shell学习
1>jq内建函数 输出所有的keys 语法: jq keys
例如:
cat json_raw.txt | jq 'keys'
[
"employees",
"location",
"name"
]
2> sed如何匹配shell 中的变量, IP和获取IP地址
!/bin/bash
newip=newip
wrong : sed 's/.../"$newip"/g' log.txt > logmod.txt
sed -r 's/(\b[0-9]{1,3}.){3}[0-9]{1,3}\b'/$newip/
3> sed中替换变量
eval sed 's/$a/$b/' filename
sed "s/$a/$b/" filename
.sed 's/'$a'/'$b'/' filename
.sed s/$a/$b/ filename
我比较喜欢第二种,也就是:Sed后面的表达式一般用单引号引起来('),当需要使用变量时就换用双引号(")。
4>关于单双引号的区别:
单引号:shell处理命令时,对其中的内容不做任何处理。即此时是引号内的内容是sed命令所定义的格式。
双引号:shell处理命令时,要对其中的内容进行算术扩展。如果想让shell扩展后得到sed命令所要的格式
>5 exec 命令
exec是shell的内建命令,执行这个命令时,系统不会重启新的shell,而是用当前执行的shell进程替换当前的shell进程。
image.png
将file文件作为标准输出全部重定向到某个文件中。
命令:exec >out.txt
表示后面所有指令的输出内容,最后都会放到out.txt文件中。
指定文件标识符
exec 指定文件标识符后,可以通过该标识符对文件进行操作。
命令:exec 3<file.txt
这里制定后,那么标识符3就可以代表file.txt 了。
关闭指令:exec 3<&-
exec>/dev/tty 是将标准输出重定向到显示器(/dev/tty 为显示终端)
>6 for循环和while循环区别
for循环,默认是用空格作为间隔读取文件
while循环,默认是用换行符来读取文件
7>常用linux指令
find / -name filename
find 指定路径 -name 文件名
awk 列处理指令
下面打印第6列内容: cat test.txt |awk '{print $6}'
vim 一般模式下 10d 删除10行
重命名为new_filename
ls | xargs -n 1 -I {} cp {} new_{}
重新命名并以此累加为1.txt, 2.txt 2.txt
ls | cat -n | while read n f; do mv -n "n.txt"; done
ls | cat -n | while read n f; do mv -n "n.jpg"; done
ls | cat -n | while read n f; do mv -n "n.jpg"; done
ls | cat -n | while read n f; do mv -n "n.jpg"; done
过滤查看具体成功的信息行数:
cat createlog.txt | grep "成功"| awk -F "," '{print $2 }'|uniq -c
unzip -v test.zip
查看压缩文件目录,但不解压。
cat rename.sh
!/bin/sh
index=1
files=(ls
)
for j in "${files[@]}"; do
if [[ $j = *.jpg ]];then
mv index.jpg &
let index=index+1
fi
done
集群上获取ip和port值:
kubectl get svc | grep redis
kubectl get pods -o wide | grep kafka
kafka-0 2/2 Running 0 27h 10.151.3.193 vpc33 <none>
kafka-1 2/2 Running 0 2d22h 10.151.3.189 vpc23 <none>
kafka-2 2/2 Running 0 2d23h 10.151.3.185 vpc13 <none>
jq指令中[] 空白,是指遍历所有:
cat data.txt |jq '.data[].uid'
"5299"
"5291"
"5290"
"5287"
"5286"
替换换行符和替换单引号为双引号:
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/, /g' uuid.txt | sed "s/'/"/g">final.txt
Test data
cat uuid.txt
'7472'
'7370'
'7361'
'7362'
连起来一行搞定:
tr '\n' , <uuid.txt | tr "'" """ >oneline.tx
解读:
tr '\n' , < file 完成换行符被替换
tr “\’” “\”” < file 完成
$? 获取上一个指令的返回值或者命令运行状态值。如果¥?==0 表示执行成功,否则fail
if[ $? !=0 ]
then
echo "failed"
exit 2
else
echo "succedd"
fi
ps s 显示当前系统中所有进程,包括具体的指令名字和pid信息。
UID PID PENDING BLOCKED IGNORED CAUGHT STAT TTY TIME COMMAND
0 363 00000000 00000000 00380004 4b817efb Ss+ pts/1 0:00 bash
0 1051 00000000 00000000 00000000 <88084003 S+ pts/0 8:30 watch -n1 ps -ef