linux shell 总结命令
目录
十三、linux shell使用expect实现sftp的自动交互
二十一、执行错误 $'\r':command not found
前情提要:
一直想避免写脚本,但是往往你不想做的事情会成为你的绊脚石,winods,linux脚本都在不断接触,每次都要重新搜索。
既然逃不掉,那就去迎接,准备把之前零散写的汇聚起来,方便自己后期查看,形成体系。
摘抄会有注明路径,持续更新...
引用:
前六部分内容原贴地址
linux shell 文件比较、字符串比较、算数等常用指令_一只没有脚的鸟-CSDN博客
一、文件比较运算符
1. e filename 如果 filename存在,则为真 如: [ -e /var/log/syslog ]
2. -d filename 如果 filename为目录,则为真 如: [ -d /tmp/mydir ]
3. -f filename 如果 filename为常规文件,则为真 如: [ -f /usr/bin/grep ]
4. -L filename 如果 filename为符号链接,则为真 如: [ -L /usr/bin/grep ]
5. -r filename 如果 filename可读,则为真 如: [ -r /var/log/syslog ]
6. -w filename 如果 filename可写,则为真 如: [ -w /var/mytmp.txt ]
7. -x filename 如果 filename可执行,则为真 如: [ -L /usr/bin/grep ]
8. filename1-nt filename2 如果 filename1比 filename2新,则为真 如: [
/tmp/install/etc/services -nt /etc/services ]
9. filename1-ot filename2 如果 filename1比 filename2旧,则为真 如: [
/boot/bzImage -ot arch/i386/boot/bzImage ]
二、字符串比较运算符
1. -z str 如果 str 长度为零,则为真 如: [ -z "$myvar" ]
2. -n str 如果 str 长度非零,则为真 如: [ -n "$myvar" ]
3. str1 = str2 如果 stri1与 str2相同,则为真 如 :["$myvar" = "one two three"]
4. str1 != str2 如果 stri1与 str2不同,则为真 如: ["$myvar" != "one two three"]
例子:
if [ `echo $tab|awk -v tem="ASD" '{print($1==tem)?"1":"0"}'` -eq "1" ]; then
else
fi
三、算术比较运算符
1. num1-eq num2 等于 如: [ 3 -eq $mynum ]
2. num1-ne num2 不等于 如: [ 3 -ne $mynum ]
3. num1-lt num2 小于 如: [ 3 -lt $mynum ]
4. num1-le num2 小于或等于 如:[ 3 -le $mynum ]
5. num1-gt num2 大于 如:[ 3 -gt $mynum ]
6. num1-ge num2 大于或等于 如: [ 3 -ge $mynum ]
四、查看磁盘、文件大小
1. df -h 查看磁盘占用情况
2、du -sm ./* 查看当前目录下文件大小,单位M
du -sh ./* 不够M的会显示其他单位
五、模仿浏览器请求curl
1,GET :
curl -i -XGET https://www.xxx.com/api/v2/test?Id=1
2,POST 发送带格式的xml报文:
curl -v -XPOST -H "Content-Type:text/xml" http://baidu.com --data-binary $'内容一列排开,用\r\n换行'
案例如下:
{H:报文头}
{S:签名}
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:990.002.01">
<ComConf>
<ConfInf>
<MsgPrcCd>MI0I0000</MsgPrcCd>
<MsgPrcInf>Success!</MsgPrcInf>
</ConfInf>
</ComConf>
</Document>
curl -v -XPOST -H "Content-Type:text/xml" http://baidu.com --data-binary $'{H:报文头}\r\n{S:签名}\r\n<?xml version="1.0" encoding="UTF-8"?><Document xmlns="urn:990.002.01"><ComConf><ConfInf><MsgPrcCd>MI0I0000</MsgPrcCd><MsgPrcInf>Success</MsgPrcInf</ConfInf></ComConf></Document>'
3,其他情况:curl_百度百科
六、文件下载或数据请求
wget https://go.microsoft.com/fwlink/?linkid=866662
七、循环和判断语句
while(true)
do
#其他代码
if[ -e /app/a.log ]; then
#真
else
#假
fi
if [ command ];then
符合该条件执行的语句
elif [ command ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi
done
八、内容写入日志文件echo
echo $(date +%Y%m%d)" service start " >>/applog/app.log
echo $(date +%Y-%m-%d\ %H:%M:%S)" service end" >>/applog/app.log
echo "$(date +%Y-%m-%d\ %H:%M:%S) service end" >>/applog/app.log
uuid=$(uuidgen |sed 's/-//g')
echo $uuid
九、休眠sleep 与定时crontab
1,sleep :休眠
sleep 48h
slepp 10s
当我们需要做的事情有一定的执行时间时,例如:日志清理要求每天,这个任务需要30分钟,那么注定会有遗漏,这时需要使用定时来满足没天执行的要求
2,crontab :定时
查看任务: crontab -l
编辑任务: crontab -e
键入 a 进入编辑模式,添加任务
00 01 * * * /app/clearLog.sh : 每日1点执行
0 0 */1 * * ? /app/clearLog.sh : 每1h执行
ctrl+c 退出编辑模式
wq 保存并退出
3,要求不适用contab,并且时间要求不能有延时
例如打包需要30分钟,如果单纯的死循环加sleep 24h 会有误差,不能保证每天都备份到。
休眠时间 = 一天的秒数 - 工作秒数
#!/bin/sh
while(true)
do
start_time=$(date %s)
#模拟工作
sleep 30m
end_time=$(date %s)
sleep_time=$[86400 - $end_time + $start_time ]
sleep $sleep_time
done
十、备份(压缩/解压)
2分钟后备份一次,打包后,以 bzip2 压缩
find /app -type f -mmin 2 | xargs tar -zcvf /backup/file.tar.gz
解压一个叫做 'file1.bz2'的文件
bunzip2 file1.bz2
压缩一个叫做 'file1' 的文件
bzip2 file1
解压一个叫做 'file1.gz'的文件
gunzip file1.gz
压缩一个叫做 'file1'的文件
gzip file1
最大程度压缩
gzip -9 file1
创建一个叫做 'file1.rar' 的包
rar a file1.rar test_file
同时压缩 'file1', 'file2' 以及目录 'dir1'
rar a file1.rar file1 file2 dir1
解压rar包
rar x file1.rar
unrar x file1.rar
创建一个非压缩的 tarball
tar -cvf archive.tar file1
创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件
tar -cvf archive.tar file1 file2 dir1
显示一个包中的内容
tar -tf archive.tar
释放一个包
tar -xvf archive.tar
将压缩包释放到 /tmp目录下
tar -xvf archive.tar -C /tmp
创建一个bzip2格式的压缩包
tar -cvfj archive.tar.bz2 dir1
解压一个bzip2格式的压缩包
tar -jxvf archive.tar.bz2
创建一个gzip格式的压缩包
tar -cvfz archive.tar.gz dir1
解压一个gzip格式的压缩包
tar -zxvf archive.tar.gz
创建一个zip格式的压缩包
zip file1.zip file1
将几个文件和目录同时压缩成一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1
解压一个zip格式压缩包
unzip file1.zip
十一、文件操作
rm -rf /app 删除目录所有 路径可以有*:例如删除当前目录下a字面开头的:rm -rf a*
mkdir dir1 创建一个叫做 'dir1' 的目录'
mkdir dir1 dir2 同时创建两个目录
mkdir -p /tmp/dir1/dir2 创建一个目录树
rm -f file1 删除一个叫做 'file1' 的文件'
rmdir dir1 删除一个叫做 'dir1' 的目录'
rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容
rm -rf dir1 dir2 同时删除两个目录及它们的内容
mv dir1 new_dir 重命名/移动 一个目录
cp file1 file2 复制一个文件
cp dir/* . 复制一个目录下的所有文件到当前工作目录
cp -a /tmp/dir1 . 复制一个目录到当前工作目录
cp -a dir1 dir2 复制一个目录 cp -r dir1 dir2 复制一个目录及子目录
ln -s file1 lnk1 创建一个指向文件或目录的软链接
ln file1 lnk1 创建一个指向文件或目录的物理链接
touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm)
mv /app/a.txt /applog/a.txt 移动文件位置
cp移动带有特殊符号的文件
cp EnumUtils$TAB_STATUS.class ./utils/
这样是移动不了的
1,带文件递归
cp /utils/EnumUtils$TAB_STATUS.class ./
2,加转义字符
cp EnumUtils$\TAB_STATUS.class ./utils/
十二、nohup不挂断的运行
nohup和&后台运行,进程查看及终止 - 慕尘 - 博客园
& : 指在后台运行
nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行
&是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出
那么,我们可以巧妙的吧他们结合起来用就是
nohup COMMAND &
这样就能使命令永久的在后台执行
1,命令永久的在后台执行:nohup sh /app/test.sh &
2,查找进程 :ps -aux|grep test.sh
2,杀进程 :kill -9 进程号
十三、linux shell使用expect实现sftp的自动交互
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。
help 查看sftp支持哪些命令
ls 查看当前目录下文件
cd 指定目录
lcd 更改和/或打印本地工作目录
pwd 查看当前目录
lpwd 打印本地工作目录
get xxx.txt 下载xxx文件
put xxx.txt 上传xxx文件
quit / bye / exit 退出sftp
sftp xxx.xxx.xxx.xxx 登录root用户
sftp username@ip 连接远程服务器
sftp_exp.sh
#!/usr/bin/expect -f
# ./app/sftp_exp.sh 123456
set passwd [ lindex $argv0 ]
spawn sftp root@127.0.0.1
expect {
"(yes/no)?" { send "yes\r": expect_coontinue }
}
expect "password:"
send "$passwd\r"
expect "sftp>"
send "cd /applog/"
expect "sftp>"
send "lcd /applog/"
expect "sftp>"
send "put /app/pro_date.tar.gz\r"
expect {
"100%" {
expect "sftp>"
send "!rm /app/pro_date.tar.gz \r"
expect_coontinue
}
}
expect "sftp>"
send "bye\r"
expect eof
十四、文件和目录
cd /home 进入 '/ home' 目录'
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd 进入个人的主目录
cd ~user1 进入个人的主目录
cd - 返回上次所在的目录
pwd 显示工作路径
ls 查看目录中的文件
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
ls *[0-9]* 显示包含数字的文件名和目录名
十五、文件搜索
find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录
find / -user user1 搜索属于用户 'user1' 的文件和目录
find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件
find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件
find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限
find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备
grep -E 'a|b' xx.log 联合搜索 a or b
grep -E 'a' xx.log |grep 'b' 联合搜索 a and b
grep -r 'a' | grep 'b' 联合搜索 a and b
//日志文件太大时,按时间搜索
sed -n '/2022-08-04/,/2022-08-05/p' a.log |grep 关键字
十六、端口查杀
windows
#查询端口对应的PID
netstat -aon|findstr 8080
#查看PID对应的应用名称,防止误杀
tasklist |findstr pid
#杀掉PID是2888
taskkill /f /pid 2888
linux
netstat -aop|grep 8080
kill -9 pid
ps -aux |grep test.sh 根据名称查看
十七、文件权限chmod
444 r--r--r--
600 rw-------
644 rw-r--r--
666 rw-rw-rw-
700 rwx------
744 rwxr--r--
750 rwxr-x---
755 rwxr-xr-x
777 rwxrwxrwx
chomd 750 * 当前目录下所有文件赋权
从左至右,1-3位数字代表文件所有者的权限,4-6位数字代表同组用户的权限,7-9数字代表其他用户的权限。
而具体的权限是由数字来表示的,读取的权限等于4,用r表示;写入的权限等于2,用w表示;执行的权限等于1,用x表示;
通过4、2、1的组合,得到以下几种权限:0(没有权限);4(读取权限);5(4+1 | 读取+执行);6(4+2 | 读取+写入);7(4+2+1 | 读取+写入+执行)
以755为例:
1-3位7等于4+2+1,rwx,所有者具有读取、写入、执行权限;
4-6位5等于4+1+0,r-x,同组用户具有读取、执行权限但没有写入权限;
7-9位5,同上,也是r-x,其他用户具有读取、执行权限但没有写入权限。
十八、分发文件scp
scp /etc/profile node02:/etc 分发文件
十九、VI常用命令
I : 进入编辑模式
wq : 保存退出
q! : 无修改退出
dd : 删除一行内容
u : 回退一次操作
/k : 根据关键字k搜索
n/N : 下一个/上一个关键字的位置
shift +G : 到达文件最底部
esc模式下 d+G :删除光标以下所有内容
shift+: .,$y :复制光标以下所有内容
Gnp :粘贴
shift+: .,$s/#// : 把#替换成空(复制的配置,前面有一行很长的#号)
2kd :删除两行
1,使用v进入可视模式
复制
y 在使用v模式选定了某一块的时候,复制选定块到缓冲区用;
yy 复制整行(nyy或者yny ,复制n行,n为数字);
y^ 复制当前到行头的内容;
y$ 复制当前到行尾的内容;
yw 复制一个word (nyw或者ynw,复制n个word,n为数字);
yG 复制至档尾(nyG或者ynG,复制到第n行,例如1yG或者y1G,复制到档尾)
剪切
d 剪切选定块到缓冲区;
dd 剪切整行
d^ 剪切至行首
d$ 剪切至行尾
dw 剪切一个word
dG 剪切至档尾
粘贴的命令式p,即put(放下)
p 小写p代表贴至游标后(下)
P 大写P代表贴至游标前(上)
二十、设置脚本执行环境
export JAVA_HOME=./java/jdk1.8.0.161
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=./$JAVA_HOME/lib/dt.jat:$JAVA_HOME/lib/tools.jar
二十一、执行错误 $'\r':command not found
这种错误是因为shell脚本是在win下编写的,每行结尾是\r\n 的Unix 结果行是\n 所以在Linux下运行脚本 会任务\r 是一个字符,所以运行错误,需要把文件处理下:
1,替换
sed -i 's/\r//' 脚本名
2,将换行符设置成UNIX的模式
命令行模式下,输入:
:set ff=unix
:wq 退出
二十二、查看应用所有端口号
ps -ef|grep syncthing
netstat -anp|grep pid
二十三、问题记录
(一),cp omitting directory
1,问题描述
在Linux系统使用cp(复制命令)复制目录时,常出现错误“cp:omitting directory "dir" ”(dir是需要复制的目录名称),是因为dir目录下存在其他目录或文件存在,不可只使用cp命令实现复制操作;
2.1,目标文件多级
使用cp命令时,加上 -r 选项,此选项指“递归持续复制,用於目录的复制行为”。 例如 cp -r dir ./usr
2.2,目地文件多级
一水的上述解决,我想加的是具体情况具体分析
cp ./file/ABC.class /app/project/zook*_domain/project/class/cn/
目标文件不是文件夹,肯定不是上述问题;
经过查看/app/project/目录,发现有多余的目录
/app/project/zookAA_domain
/app/project/zookBB_domain
无法保证抵达位置的唯一性,我们需要根据具体情况来判断,是加-r都替换,还是确认好抵达路径的唯一性在操作
cp ./file/ABC.class /app/project/zookBB_domain/project/class/cn/
3,总结
问题的关键在于确认移动的目标和目的文件是否唯一;根据具体情况使用对应的方法解决问题