美文网首页
Shell脚本

Shell脚本

作者: D_Major | 来源:发表于2019-06-11 09:43 被阅读0次

ctrl+s卡死时使用ctrl+q恢复
换源sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
后台运行nohup ./program >/dev/null 2>&1 &, 格式为nohup ... &,这个&无意义
打包zip -qr xxx.zip xxx, 删除某个文件zip -dv xxx.zip a.cc
conda列出所有环境conda info -e

find命令

查找某一文件名后缀的文件

find ./ -name '*.jpg'

逻辑反"!" 逻辑或"-o" 逻辑与"-a"
查找不为.jpg后缀的, 以及不为.jpg .png后缀的

find ./ ! -name '*.jpg'
find ./ ! -regex  ".*\.\(jpg\|png\)"

查看某一文件名后缀文件的数量

find ./ -name "*.gif" | wc -l
ls *.gif | wc -l

参考https://blog.csdn.net/huayangshiboqi/article/details/80635863
find命令可以在不通位置根据不同标准搜索任何文件,并支持多种方式处理搜索结果。其工作流程:
(1)搜索所有用户指定的路径,包括所有的子目录。
(2)对于遇到的每个文件,根据是否符合用户指定的条件,所有符合条件的文件形成一个列表。
(3)对于结果列表的文件,执行用户指定的操作。

参数:
-name filename #表示包含指定匹配模式的文件名
-iname filename #表示包含指定匹配模式的文件名,不区分大小写
-type #指定文件类型,f表示普通文件 ,d表示目录,c表示块设备,p表示管道,l表示连接
-user userid #匹配其所有者为指定用户ID的文件
-group groupid #匹配其所有者的组为指定组ID的文件
-size size  #匹配其大小为size的文件
-empety   #匹配空文件
-amin[-+]n #文件最后一次访问时间,-n表示时间为n分钟以内,+n表示n分钟之前,n表示刚好n分钟
-atime [-+]n    #天
-cmin[-+]n    #文件最后一次状态改变时间
-ctime[-+]n   #
-mmin [-+]n  #最后一次被修改时间
-mtime [-+]n 
动作:
-print #默认动作,将搜索结果写入到标准输出
-fprint file #将搜索结果写入到file中
-ls #以详细格式展示搜索结果
-fls file #将详细格式结果写入file
-delete #将结果文件删除
-exec command {} \; #查找并执行命令,{}表示搜索到的文件名
-ok command {}\; #查找并执行命令,但是需要用户确认

参考https://blog.51cto.com/12013190/2105868

grep命令

grep -r "tast_struct {" /usr/寻找定义结构体的头文件, 因为find只能查找属性(如文件名), 但grep使用正则表达式在文件内容中做检索.

locate命令

[root@node-2 ~]# touch helloWorld
[root@node-2 ~]# locate helloWorld 
[root@node-2 ~]# updatedb
[root@node-2 ~]# locate helloWorld 
/root/helloWorld

直接查找文件名即可, 只不过数据库每天更新一次, 所以新文件需要updatedb

批量转化图片格式

mogrify -path newdir -format jpg *.gif

将所有.gif转化成.jpg
也可使用shell脚本

for file in *.gif; do convert $file ${file%%.*}.jpg; done

for file in *.png
    do convert $file ${file%%.*}.jpg
done

截短文件名

filename="hello.jpg"
name=${filename%lo*} //截取文件名从右向左第一个.之后全删除
echo $name         //打印hel

filename="hello.jpg"
name=${filename#*lo} //截取扩展名,从左向右第一个点后面所有,##从右向左第一个点后面所有
echo $name        //打印.jpg

%abc*从尾部开始删, 保留前面的, 所以abc后面的*是什么都无所谓
#*abc从头部开始删, 保留后面的, 所以abc前面的*是什么都无所谓
%%或##为贪婪匹配, 尽可能多删

读取输入数据

read -p "Enter an integer:" num

大小比较

-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于

变量类型转换

数字类型转字符类型

aa=$((1+1));echo $aa

变量aa赋值为整数2,但echo 输出时已被当成字符型。当然我们也可以强制进行转换,如:

echo $aa""

通过与空字符串进行连接,强化将变量aa转化成了字符型。
字符类型转数值类型

反过来,字符类型转数值类型也是可以实现的。
如:

aa=12;
aa=$(($a+4));
echo $aa;

在shell中,给变量赋值中的数字默认是被当做字符串的。

进制转换

temp1=400d7c
echo $((16#${temp1}+4))    (打印默认是十进制输出的)
4197760
temp2=$((16#${temp1}+4))    (转为16进制进行运算)
echo "obase=16;${temp2}"|bc    (以16进制打印)
400D80

以上内容是将字符串转为16进制后进行运算,然后再以16进制打印出来。
十进制转其他进制:
借用bc外部命令, bc命令格式转换为:echo "obase=进制;值"|bc

其他进制转十进制:

[chengmo@centos5 ~]$ ((num=0xff)); 
[chengmo@centos5 ~]$ echo $num;    
255
[chengmo@centos5 ~]$ ((num=16#ff));
[chengmo@centos5 ~]$ echo $num;    
255

同理 ((num=0123));((num=8#123));

shell中内置各种进制表示方法非常简单。记得base#number 即可。这里记得赋值时候用(())符号。不能直接用=号了。=号没有值类型。默认将后面变成字符串了.
可以通过定义符:let达到(()) 运算效果。

num=0123
echo $num
0123

可见直接赋值是字符串, 需加(())或字符串

批量杀进程

查看keras的僵尸进程

ps -aux | grep train_icdar_*

批量杀进程

ps -aux | grep train_icdar_pa* | grep -v grep | cut -c 9-15 | xargs kill -s 9

kill -9 pid杀死单个进程

批量修改文件名

rename 's/JPG/jpg/' *

's/JPG/jpg'是perl表达式, rename命令在ubuntu下是2个参数, centos下是3个参数, 如rename 'JPG' 'jpg' *

curl命令

curl -s -L http****
-s silent不显示进度条
-L 重定向, 如果页面不存在跳转到新的页面
-O 直接下载下来
-o a.txt 重命名并下载到本地

wget命令

使用账户下载

wget -vcr -np www.xxx.com/a.txt --http-user name --http-passwd password --no-check-certificate

ubuntu挂载移动硬盘/U盘

sudo fdisk -l    # 列出所有硬盘
sudo mount -t vfat /dev/sdb1 /media    # U盘
sudo mount -t ntfs /dev/sdb3 /media    # 移动硬盘
cd /media
sudo umount /dev/sdb1 #卸载

如果读取不了exfat可以安装exfat-fuse包

awk命令

对于'|'或'\t' '\n'分割的文件test.txt, awk可以输出分割后的内容

# 利用printf格式化输出, %s 字符,%d 整数,%f 浮点 ; %5.2f代表最小长度5位保留2位小数, 即2整数+小数点+2小数, 整数部分超出则保留
# %30s 右对齐,长度30,实际长度大于设置长度,按实际长度
# %-30s 左对齐,其他同上
# NR行数, NF列数, $0所有列

#打印文件内容
cat -n kimbo_test.txt
#打印第二行之后的,列1,列4
awk -F"|" 'NR>=2{print $1,$4}' kimbo_test.txt
#打印第二行之后的,列1,列4 ,利用printf格式化输出 ,列1左对齐
awk -F"|" 'NR>=2{printf "%-30s\t%5.2f\n",$1,$4;}' kimbo_test.txt
#打印第二行之后的,列1,列4 ,利用printf格式化输出 ,列1右对齐
awk -F"|" 'NR>=2{printf "%30s\t%5.2f\n",$1,$4;}' kimbo_test.txt
##多个命令,也可以分号分隔, 同第二句
## 打印第二行之后的,列1,列4 ,利用printf格式化输出 ,列1左对齐
awk -F"|" 'NR>=2{printf "%-30s\t",$1}; NR>=2{printf "%5d\n", $4}' kimbo_test.txt 
##begin end 用法
#打印第二行之后的,列1,列4
awk -F"|" 'BEGIN {print "start-->"} NR>=2{print $1,$4} END{print "end"}' kimbo_test.txt

sed命令

一般和awk命令一起使用用于输出文件行的内容
ps | awk '{print $2}' | sed -n '1,3p' 查看当前进程表第2列的1到3行

sed -n '3p' /var/log/yum.log  # 显示第3行,  $是最后一行
sed -n '3,9p' /var/log/yum.log  # 显示第3到9行
sed  '3,9d' /var/log/yum.log  # 删除第3到9行
# 在文件第一行上面插入happy,在文件结尾添加new year
sed -e '1i happy' -e '$a new year' yum.log       #【界面显示】
sed -i -e '1i happy' -e '$a new year' yum.log    #【真实写入文件】

-n是选择性输出, -i是修改文件内容, -e是多项编辑但不修改, 在行号后面p是print, d是delete, i是insert, a是add. &符号代表上次匹配到的行

cat写入文件内容

cat > exocr.txt << EOF ......EOF当docker无vi时使用cat写入, 记得结尾加EOF

python中执行shell脚本

使用os.system

import os
os.system('python3 /usr/local/lib/python3.5/dist-packages/uff/bin/convert_to_uff.py models/lenet5.pb')

引用父级目录的文件

若无法导入父级目录的文件需要将父级目录加入PYTHON_PATH

import sys, os
sys.path.insert(1, os.path.join(sys.path[0], ".."))

截取文件首尾

截取头部的18000行

head -n18000 train.txt > train.txt.tmp
mv train.txt.tmp train.txt

截取尾部的2000行

tail -n2000 train.txt > test.txt

随机选择验证集的2000行

shuf -n2000 train.txt > test.txt
sort test.txt > test.txt.tmp
mv test.txt.tmp test.txt

>和>>

当文件不存在时, 二者皆创建文件
当文件存在时, >覆盖, >>追加

tee命令

who | tee userinfo.txt, 把输出到终端的信息备份一份到一个文件中, 如果tee > userinfo.txt会直接重定向到文件, 不会输出到终端.

apt离线安装包

sudo apt install -d ***, 只下载包
然后sudo dpkg -i ***手动解压
注意依赖的包要下全
缺失的依赖包如libsm6可以到https://packages.ubuntu.com/xenial/libsm6下载, xenial是ubuntu16.04的代号, libsm6是包名. 架构选amd64即可下载对应的.deb包

定时任务

crontab -e, 然后在里面输入时间频率 + 命令, 时间格式为分时日月周, 之后service cron restart (mac是sudo /usr/sbin/cron restart)

# 每天9点运行一次语句为:
0  9  *  *  *  /usr/bin/python3 /home/xiaofeng/cleanroom.py

每小时执行 0 * * * *
每隔2小时执行 * */2 * * * (/表示频率)
每天执行 0 0 * * *
每周执行 0 0 * * 0

相关文章

  • Shell入门笔记

    Shell脚本:Linux Shell脚本学习指南菜鸟教程 - Shell教程Linux入门 - Shell脚本是...

  • 2018-09-26

    shell脚本 1.1、什么是shell脚本(shell script , ...

  • Shell script + crontab实现Mysql定时备

    一、Shell 脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 业界所...

  • 嵌入式day12

    shell脚本的本质 shell脚本语言是解释型语言 shell脚本的本质:shell命令的有序集合 shell编...

  • shell脚本

    什么是shell脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说...

  • Shell脚本语法

    1. Shell脚本简介Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所...

  • shell脚本

    什么是Shell脚本 Shell脚本(英语:Shell script),又称Shell命令稿、程序化脚本,是一种电...

  • 【生物信息笔记】shell 脚本 (dry-2)

    shell 和 shell script(脚本)区别: shell 和 shell 脚本是两个不同概念,shell...

  • chapter 11. 构建基本脚本

    创建shell脚本 shell脚本第一行为指定具体shell来运行该脚本,可以指定shell(待验证) echo ...

  • PySparkSQL脚本模板

    PySpark模板分为shell脚本和python脚本两部分,通过shell脚本提交spark任务。 shell脚...

网友评论

      本文标题:Shell脚本

      本文链接:https://www.haomeiwen.com/subject/dxkffctx.html