linux shell 总结命令

目录

前情提要:

引用:

一、文件比较运算符 

二、字符串比较运算符

三、算术比较运算符 

四、查看磁盘、文件大小 

五、模仿浏览器请求curl

六、文件下载或数据请求

七、循环和判断语句

八、内容写入日志文件echo 

九、休眠sleep 与定时crontab

十、备份(压缩/解压)

十一、文件操作

十二、nohup不挂断的运行

十三、linux shell使用expect实现sftp的自动交互

十四、文件和目录 

十五、文件搜索 

十六、端口查杀

十七、文件权限chmod

十八、分发文件scp

十九、VI常用命令

二十、设置脚本执行环境

二十一、执行错误 $'\r':command not found

1,,替换

2,将换行符设置成UNIX的模式

二十二、查看应用所有端口号

二十三、问题记录

(一),cp omitting directory

1,问题描述

2.1,目标文件多级

2.2,目地文件多级

3,总结


前情提要:

一直想避免写脚本,但是往往你不想做的事情会成为你的绊脚石,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

十、备份(压缩/解压)

Linux tar 命令 | 菜鸟教程

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 详解 - jiangxiaobo - 博客园

& : 指在后台运行

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,总结

问题的关键在于确认移动的目标和目的文件是否唯一;根据具体情况使用对应的方法解决问题