命令&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脚本技巧的主要内容,如果未能解决你的问题,请参考以下文章