命令&Shell脚本技巧

Posted 程序猿欧耶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了命令&Shell脚本技巧相关的知识,希望对你有一定的参考价值。

    下面所列命令或脚本都是基于类Linux系统环境,AIX或Solaris等Unix环境不在所列范围之内,只列一些日常最常用的一些命令。




命令介绍

  • 查询关键字

# 查询包含关键字行及其下面一行

grep -A 1 'hello' file.txt 


# 查询包含关键字行及其上面一行

grep -B 1 'hello' file.txt 


# 查询包含关键字行及其上下各一行

grep -C 1 'hello' file.txt 


# 查询包含关键hello或hep的行,并且显示行号

egrep -n 'hello|hep' file.txt 


  • 查找文件

# 在当前目录下查询gz后缀的文件

find . -name '*.gz'


# 查询最近2天前被修改的文件或目录

find . -mtime 2


-mtime n(天)        n天前被修改的

-mmin n(分钟)     n分钟前被修改的

-atime n(天)         n天前被访问过的

-amin n(分钟)      n分钟前被访问过的

-ctime n(天)        n天前被修改过元数据(权限、所有权)

-cmin n(天)         n分钟前被修改过元素(权限、所有权)


# 从匹配到的文件中查询指定关键字文本行

find . -name '*.txt'|xargs grep 'hello'


# 搜索后缀为conf,xml,ini,properties的文件

find . -name '*.conf' -o -name '*.xml' -o -name '*.ini' -o -name '*.properties'


  • 建立软连接

ln -s 源文件(目录) 链接文件(目录)

这个东西类似window下的快捷方式,常用场景,例如我们用来指向不同的JDK

ln -s /usr/local/jdk1.7.0_112 /usr/local/java

ln -s /usr/local/jdk1.8.0_181 /usr/localjava

程序启动脚本中只需要配置/usr/local/java这个目录就行了,只需要改变指向就可以轻松达到切换不同版本JDK的目的,软连接删除和删除普通文件一样



  • 查看系统剩余内存(物理+cached)

free -g|grep Mem|awk '{print $4+$7" GB"}'


  • 查看端口被哪个进程占用

netstat -nap|grep 11201|grep -i listen|awk '{print $7}'


  • 查看某个端口ip的连接情况

例如:统计下连192.168.25.104这台机器上1521端口连接的ip情况

netstat -nap|grep '192.168.25.104:1521'|awk '{print $5,$6}'|awk -F ':' '{print $1}'|sort|uniq -c|sort -nk 1


  • 查看某个目录的磁盘占用

du -sh


  • 更改权限

chmod u+x file # 拥有者增加执行权限

chmod u-x file  # 拥有者去掉执行权限

chmod o+x file # 其他组成员增加执行权限

chmod o-x file  # 其他组成员去掉执行权限

chmod 755 file # 修改拥有者(读写执行),同组(读执行),其他组(读执行)


  • 更改所有者

chown -R 账号:组 文件(目录)


  • 查看某个进程的top数据

top -p PID


  • 查看某个进程中线程的cpu占用情况(2秒输出一次结果)

pidstat -p PID -t 2


此命令主要场景是用来定位占用cpu高的线程


  • crontab调度

crontab -e # 编辑crontab调度信息

crontab -l # 查看crontab调度信息

crontab -l > crontab_bak20181203 # 将crontab调度信息备份到文件

crontab crontab_bak20181203 # 使用crontab_bak20181203进行恢复


  • 查看某个命令的引用路径

which ls

which java


  • 查看系统字符串

locale  # 查看系统当前字符集

locale -a # 查看系统支持的所有字符集


  • 解压缩命令

tar -cvf test.tar test.txt ./conf # 将文件test.txt和目录./conf压缩为test.tar文件

tar -xvf test.tar # 解压文件test.tar

gzip test.tar # 将文件test.tar压缩为test.tar.gz

gunzip test.tar.gz # 将文件test.tar.gz解压为test.tar


  • 别名alias

[root@seaapp ~]# alias psl="ps -ef|grep"

[root@seaapp ~]# psl cron

root      2343     1  0 03:24 ?        00:00:00 crond

root     14266  2736  0 07:38 pts/1    00:00:00 grep cron

[root@seaapp ~]# 

也可以在~/.bash_profile文件中添加永久生效,上面只会在当前会话生效,一旦退出会话psl别名就不生效了


  • sed命令

这个命令也很强大,就写一个常用的用法替换文件中的指定文本内容

sed -i 's/需要替换的内容/替换后的内容/g' filename


  • awk命令

这个命令太强大变态,可以用无所不能来形容,完全可以单独拿一篇来讲,后面会详细写一篇介绍这个工具。




脚本介绍

  • 控制语句


# if控制语句

if [ 表达式 ];then

// 逻辑分支

elif

// 逻辑分支

else

// 逻辑分支

fi


# for循环

for file in `ls .`;

do

// 循环体逻辑

done


# while循环

while true;

do

// while循环体

done


# case控制语句

way="b"

case $way in

a)

        echo "aa";

;;

b)

        echo "bb";

;;

c)

        echo "cc";

;;

*)

        echo $1;

;;

esac


  • 函数定义执行

定义函数fn

fn()

{

// 函数体

}


调用fn

fn

获取函数输出内容

result=`fn`



  • 变量取赋值

定义变量

foo="bar"

获取变量

echo $foo



  • here文档

here文档定义:here 文档here document (LCTT 译注:here 文档又称作 heredoc )不是什么特殊的东西,只是一种 I/O 重定向方式,它告诉 bash shell 从当前源读取输入,直到读取到只有分隔符的行。

这对于向 ftp、cat、echo、ssh 和许多其他有用的 Linux/Unix 命令提供指令很有用。


操作数据库的场景

count()

{

sqlplus -S user/password@sid <<EOF

select count(1) user;

EOF

}


echo "`count1`"


FTP的场景

ftp -i -n 192.168.56.2 << EOF 

user test test123  

pwd  

cd test  

put test.txt

get xxx.txt  

close

bye

EOF


  • expect交互


以下是一个使用sftp上传文件到服务器的脚本例子

#!/usr/bin/expect -f

set upFile [lindex $argv 0]

set remotePath [lindex $argv 1]

spawn sftp test@192.168.56.2

expect "password:"

send "test123"

expect "sftp>"

send "put $upFile $remotePath\r"

expect "sftp>"

send "bye\r"

expect eof


expect如果存在多种预判结果

expect {

"yes/no" { send "yes\r"; exp_continue}

"password:" { send "xxx\r" }

}


  • 脚本预定义参数

$* 所有参数

$# 参数个数

$$ 进程的ID

$? 进程的返回状态

$! 上一个shell进程号






以上是关于命令&Shell脚本技巧的主要内容,如果未能解决你的问题,请参考以下文章

收集的48个Shell脚本小技巧

一个Shell脚本装逼的小技巧

shell 脚本中执行重启完成后继续执行其它的命令

shell 中的常用技巧

shell脚本定时后台执行

shell脚本--php执行shell命令