一直在更新中 ing…
1.查找当前路径下的文件夹个数
ls -l|wc -l
#或者指定文件的个数
ls filename| wc -l
2.遍历文件夹下的文件或文件夹
#这样得到的是文件的内容(原理基本上差不多)
path=`cat ${csvpath}`
for locations in $path
doecho $locations
done
#这样得到的是当前路径下的文件夹的名字
for file in `ls $locations`
doecho $file
done
其实这些还有其他写法:知道就可以了。
#这样得到的是文件的内容(原理基本上差不多)
path=$(cat $csvpath)
for locations in $path
doecho $locations
done
注:用for循环有时候会有问题,可能不是真的一次遍历一行,有时候是遇到空格也会遍历一次。
查了一下,这时候就需要用while循环(其实还有很多种while循环,个人比较喜欢这种)来遍历一行。
cat file|while read line
doecho $line
done
3.删除某些行的操作
删除指定行号的行sed -i '2d' test_temp#指定行添加内容
sed -i '3i lkdfjklsjfflk' a.txt
#往a.txt文件中的第三行添加内容-"lkdfjklsjfflk"
删除包含指bai定关键字的行:sed -i '/hello/d' test_temp
sed -i '1d' a.txt删首行sed -i '$d' b.txt删尾行sed -i ‘1,2d’a.txt删2行sed -i 's/[ ]*//g' c.txt删空格sed -i '/^$/d' d.txt删空行sed -i ‘/love/d’ a.txt删包含string的行
注:匹配任意字符:
1.删除以a开头的行
sed -i '/^a.*/d' tmp.txt
#^a表示开头是a, .*表示后跟任意字符串
2.linux sed删除^M换行符以及^
[[转义字符
删除文档中的蓝色转义字符^M:
注意:^M 不能从键盘输入^和M,也不能复制。而是需要按Ctrl+v 然后再按Ctrl+M 按Ctrl+v的时候屏幕不会输出,再按下Ctrl+M的时候即会出现^M 这个很重要!!!!!输入结束要再次按Ctrl+v键盘会切换回来。
sed -i 's/^M//g' swlog.log
^[[16D 文档里出现的这个字符里^[是蓝色的,应该是转义字符,删除这个跟上面方法一样,Ctrl+V 然后Ctrl+[ 剩下的是普通字符,可以替换。
教程:sed相关教程
4.对脚本中函数传递的路径参数进行截取,发现了以下比较好用的方法,记录下:
file=/dir1/dir2/dir3/my.file.txt
我们可以用${ }分别替换获得不同的值:
${file#*/}:拿掉第一条/及其左边的字串:dir1/dir2/dir3/my.file.txt${file##*/}:拿掉最后一条/及其左边的字串:my.file.txt${file#*.}:拿掉第一个.及其左边的字串:file.txt${file##*.}:拿掉最后一个.及其左边的字串:txt${file%/*}:拿掉最后条/及其右边的字串:/dir1/dir2/dir3${file%%/*}:拿掉第一条/及其右边的字串:(空值)${file%.*}:拿掉最后一个.及其右边的字串:/dir1/dir2/dir3/my.file${file%%.*}:拿掉第一个.及其右边的字串:/dir1/dir2/dir3/my
5.显示或获取文件的某行内容
sed -n 2p a.txt
line=$(head -n 1 filename)
方法1:
head -m filename | tail -1 //查看filename文件的第m行(tail -1 是数字1)e.g. head -100 data.txt | tail -1 //查看data.txt文件的第100行
方法2:
nl filename | sed -n 'mp' //查看filename文件的第m行e.g. nl data.txt | sed -n '100p' //查看data.txt文件的第100行
方法3:
sed -n 'mp' filename //查看filename文件的第m行e.g. sed -n '100p' data.txt //查看data.txt文件的第100行
方法4:
awk 'NR==m' filename //查看filename文件的第m行e.g. awk 'NR==100'data.txt //查看data.txt文件的第100行
6.Shell脚本中判断字符串是否被包含在内
1、字段 grep:
案例:
str1="abcdefgh"
str2="def"
result=$(echo $str1 | grep "${str2}")
if [[ "$result" != "" ]];thenecho "包含"
elseecho "不包含"
fi
2. 字符串运算符 =~:
案例:
str1="abcdefgh"
str2="def"
if [[ $str1 =~ $str2 ]];thenecho "包含"
elseecho "不包含"
fi
3、 正则表达式中的通配符 *:
案例:
str1="abcdefgh"
str2="def"
if [[ $str1 == *$str2* ]];thenecho "包含"
elseecho "不包含"
fi
7.shell下如何重命名一个文件
linux下重命名文件或文件夹的命令mv既可以重命名,又可以移动文件或文件夹.
例子:将目录A重命名为B
mv A B
例子:将/a目录移动到/b下,并重命名为c
mv /a /b/c
mv file1 file2
8.撤销指令–ctrl+s之后,假死
在linux系统中,使用vi编辑,在命令行模式(按ESC)下 按 u 是撤销,相当于windows 下的ctrl+z,
取消上一步操作是 ctrl+r 相当于window下的 ctrl+y
在Linux下,Ctrl+S 是暂停该终端,阻止向该终端输出。那如何解决呢?按下Ctrl+Q就可以了。在Linux终端 Ctrl+Q :恢复向终端输出。
9.解压缩.tar.gz文件
指令一
解压
关于tar.gz解压与压缩:
注:最好是相对路径压缩,不然解压的时候解压出来就是按照路径解压
压缩:
tar -zcvf file.tar.gz file
解压:
tar -zxvf java.tar.gz
#解压到指定的文件夹
tar -zxvf java.tar.gz -C /usr/java
关于解压.gz
文件或者.tar
的命令:
gunzip file.gz
10.删除文件,复制文件,剪切文件等操作
rmdir:删除空目录
如果希望删除非空目录,那么则执行:
rm -rf 目录
注:
rm:删除对应的文件或者文件夹
用法:rm [选项] 文件夹
选项: -r 递归删除整个文件夹
-f 强制删除不提示
cp:用来进行复制文件
用法:cp 文件目录/
如果需要递归复制一个目录下的所有文件:
cp -r 目录1 目录2/
mv:用来为文件或目录改名、或将文件或目录移入其它位置。
语法:
mv [options] source dest
mv [options] source… directory
参数说明:
-b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
-i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。
-f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
-n: 不要覆盖任何已存在的文件或目录。
-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
mv 参数设置与运行结果:
1.mv source_file(文件) dest_file(文件)
将源文件名 source_file 改为目标文件名 dest_file
2.mv source_file(文件) dest_directory(目录)
将文件 source_file 移动到目标目录 dest_directory 中
3.mv source_directory(目录) dest_directory(目录)
目录名 dest_directory 已存在,将 source_directory 移动到目录名 dest_directory 中;目录名 dest_directory 不存在则 source_directory 改名为目录名 dest_directory
11.遍历文件的含有某些关键字的内容
cat 7prc_pro.pdbqt|grep ZN
cat 6arv_pro.pdbqt|grep HETATM|grep AC
12.针对匹配某些数,然后进行替换,改写
在终端使用vi编辑器创建一个‘testRep.txt’文件,并在文件写内容如下:
hello world
hello world
hello world world
保存退出。
在终端替换文本内容需要使用sed命令,格式如下:
sed -i [替换格式] [文件名]
替换格式为:
‘s###’ —> ‘s#原内容##’ —> ‘s#原内容#替换后内容#’
例如替换每行首个world单词为World时使用命令:
sed -i ‘s#world#World#’ testRep.txt
替换完成后,查看testRep.txt内容如下图所示,每行首个world变成了World。
指定行号替换首个匹配内容在替换格式的最前面加行号即可,格式为:
sed -i ‘行号s#原内容#替换后内容#’ 文件名
例如替换第2行的首个World为world,使用命令:
sed -i ‘2s#World#world#’ testRep.txt
替换完成后,查看testRep.txt内容如下图所示,第2行首个World变成了world。
如果不指定行号,默认就是每行,不指定行号指定列号替换匹配内容,格式为:
sed -i ‘s#原内容#替换后内容#列号’ 文件名
例如替换每行第1个的World为world,使用命令:
sed -i ‘s#World#world#1’ testRep.txt
替换完成后,查看testRep.txt内容如下图所示,每行第1个World变成了world。实际列号就是指出现的第几次,而不是所处的列。
替换全部匹配内容,需要在上一步的替换格式后加g,例如替换所有的world为World,使用命令:
sed -i ‘s#world#World#g’ testRep.txt
替换完成后,查看testRep.txt内容如下图所示,所有的world都变成了World。
替换行号和列号可以同时使用,例如替换第3行第2个World为world,使用命令:
sed -i ‘3s#World#world#2’ testRep.txt
替换完成后,查看testRep.txt内容如下图所示,第3行第2个World都变成了world。
注:如果行数是变量的话,不能简单地${}, 需要在外面加上'""'
需要'sed -i ''"{i}"'s#World#world#2' testRep.txt'
找到一个sed教程:sed
sed的另一个教程(可以将一行都替换–类似于将这一行先删掉,然后添加自己的数据):
sed
13.创建文件 touch filename
14.获得字符串所在行数及位置
①. 获取字符串所在的行数
方式一:用grep -n
[root@root]# cat test
apple
bit
create
delect
exe
flow
good
[root@root]# cat test | grep -n exe
5:exe
[root@root]# cat test | grep -n exe | awk -F ":" '{print $1}'
5
方式二:用sed -n ‘/查询的字符串/=’ 文件
[root@root]# cat test
apple
bit
create
delect
exe
flow
good
[root@root]#
[root@root]# sed -n '/exe/=' test
5
②. 获取字符串中字符所在的位置
方式一:用awk -F 和 wc -c 组合
[root@root]# echo 'uellevcmpottcap' | awk -F 'ott' '{print $1}';
uellevcmp
[root@root]# echo 'uellevcmpottcap' | awk -F 'ott' '{print $1}' | wc -c
10
方式二:用awk ‘BEGIN{print index("’str′","′{str}'","'str′","′{str1}‘") }’
[root@root]# str='uellevcmpottcap';str1='ott';awk 'BEGIN{print index("'${str}'","'${str1}'") }'
10
15.判断文件夹或者文件是否存在
文件夹不存在则创建
if [ ! -d "/data/" ];thenmkdir /data
elseecho "文件夹已经存在"
fi
文件存在则删除
if [ ! -f "/data/filename" ];thenecho "文件不存在"
elserm -f /data/filename
fi
判断文件夹是否存在
if [ -d "/data/" ];thenecho "文件夹存在"
elseecho "文件夹不存在"
fi
判断文件是否存在
if [ -f "/data/filename" ];thenecho "文件存在"
elseecho "文件不存在"
fi
文件比较符
-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2新 [ "/data/file1" -nt "/data/file2" ]
-ot 判断file1是否比file2旧 [ "/data/file1" -ot "/data/file2" ]
16.查看含有指定字符串的行数,以及改写这一行
cat 7prc_pro.pdbqt|grep -n FE| awk -F ":" '{print $1}'sed -i '18497s/0.150 Fe/0.000 Fe/g' 7prc_pro.pdbqt
17.if判断查到的内容是否存在
#如果内容存在,则为True
if [ -z "$STRING" ]; then echo "STRING is empty"
fi
#如果内容为非空,则为True
if [ -n "$STRING" ]; then echo "STRING is not empty"
fi
一个自己用的例子
if [ -n "`cat ${pdbqtfile}|grep -n FE`" ]
thenecho $file >> "FE-IC50.txt"
fi
18.grep匹配问题
》比较好的教程《
例:
if [ -n "`cat ${pdbqtfile}|grep "Ca$"`" ]
thenecho $file >> $resultfile
fi
19.匹配某一行然后在原文中只删除匹配的行
如果有一个abc.txt文件,内容是:
aaa
bbb
BATBUSINESSTYPE, INSIDEID–) ONLINE;
INSIDEID–) ONLINE
ccc
ddd
eee
fff
如果要删除ddd,那么脚本可以这样写:
sed -i '/ddd/d' abc.txt
如果删除的是一个变量的值,假如变量是var,应该写成:
sed -i '/'"$var"'/d' abc.txt
至于grep -v aaa abc.txt
这个方法,是无法将修改的结果写入abc.txt中去的。
[asp@BJ-CP-7F-106-36 result]$ cat 11371_mobile_20110425.csv
20110425,北京,北京,13661189983
20110425,北京,北京,15810705979
WAPSJBBI_101>
WAPSJBBI_101>spooloff;
[asp@BJ-CP-7F-106-36 result]$ sed -i '/WAPSJBBI_101>/d'11371_mobile_20110425.csv
[asp@BJ-CP-7F-106-36 result]$ cat 11371_mobile_20110425.csv
20110425,北京,北京,13661189983
20110425,北京,北京,15810705979
sed 后面那个/d是删除的作用:
写成sed ‘/WAPSJBBI_101>/d’ 11371_mobile_20110425.csv其实就是在文件11371_mobile_20110425.csv里找到跟 “WAPSJBBI_101>”匹配的行,然后删掉。
因为原文中含有“WAPSJBBI_101>”的行是2个,因此就2个一口气都删除了。
- 删除:d命令
$ sed -i '2d' example-----删除example文件的第二行。
$ sed -i '2,$d' example-----删除example文件的第二行到末尾所有行。
$ sed -i '$d' example-----删除example文件的最后一行。
$ sed -i '/test/d' example-----删除example文件所有包含test的行。
sed 's/|/,/g' aaa.txt>bbb.txt
这个的意思就是把aaa.txt文件中所有字符串‘|’都换成‘,’
s代表字符串,g表示行内全面替换。
- 替换:s命令
$ sed 's/test/mytest/g' example
-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
$ sed -n 's/^test/mytest/p' example
-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
$ sed 's/^192.168.0.1/&localhost/' example
-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
$ sed -n 's/able/\1rs/p' example
-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
$ sed 's#10#100#g' example
-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
cat init.ora | grep -v ^#|grep –v ^* > initprod.ora
另结:
sed -i '3iabc' test.txt
在指定行插入第3行插入数据,注意’3iabc’中“ i ”的作用,插入的数据成为了文件的第3行,原来的第3行变为了第4行,也就是把数据插入在第3行的前边
sed -i '3aabc' test.txt
在指定行插入第3行插入数据,注意’3aabc’中“ a ”的作用,插入的数据成为了文件的第4行,原来的第3行还是第3行,也就是把数据插入在第3行的后边
sed -i '3d' test.txt
删除文件的指定行,删除文件的第3定行
sed -i '3,5d' test.txt
删除文件的多行,删除文件3到5行
另结:
1、sed -i:表示直接对文本操作
2、sed -i ‘/字符串/d’ file: d,表示删除,整条命令表示删除文件中于字符串匹配上的行
3、^ 表示行首,$表示行尾,用这个两个字符配合字符串,可以强制匹配某行内容
不完全匹配
#在文件file中,删除含有字符串str的行
#
sed -i '/str/d' file
完全匹配
当目标字符在文件中,匹配多行时,利用(一)中的方法,会将所有包含该字符串的行都删除;若只想删除跟目标字符串完全匹配的那一行,则可以使用如下命令:
#在文件file中,删除于字符串完全对应的行
sed -i '/^str$/d' file
20.查看文件具体参数的方法
ls -l 或者 ll (ls -l 别名)
# ll anaconda-ks.cfg //看第一个字符-rw-------. 1 root root 2460 6月 1 23:37 anaconda-ks.cfg
file 命令
# file anaconda-ks.cfg anaconda-ks.cfg: ASCII English text
另例:
file pdbconvert
pdbconvert: POSIX shell script, ASCII text executable
21.linux的文件类型
1.普通文件类型
Linux中最多的一种文件类型, 包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件.第一个属性为 [-] 。
2.目录文件
就是目录, 能用 # cd 命令进入的。第一个属性为 [d],例如 [drwxrwxrwx]。
3.字符设备或块设备文件
块设备文件 : 就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。第一个属性为 [b]。
字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]。
4.套接字文件
这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型。
5.管道文件
FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]。
6.链接文件
类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]。
22.通过awk来分割取数据
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
菜鸟教程
例:
Sorry, there are no Gasteiger parameters available for atom 5ujo_ligand:default:LSI:RU
cat c01b01.o5979156 | grep ^Sorry | awk -F " " '{print $10}'| awk -F "_" '{print $1}'
#结果:
5ujo
23.如何查看文件或者文件夹的大小
查看一个文件夹中所有文件的大小(不含子目录中的文件):
du -Sh
或du -Ssh
查看一个文件夹中所有文件的大小(包含子目录中的文件):du -h
或者du -sh
S:表示不统计子目录,s:表示不要显示其下子目录和文件占用的磁盘空间大小信息,只显示总的占用空间大小,h:以适合阅读的单位显示
查看文件夹中每一个文件的大小:du -ah
或者ls -lRh
Linux 查看某个目录下文件的大小,使用du命令,缺省地,du命令会打出每个子目录的大小,当只希望看某个目录下文件大小时使用-s参数:du -sh modules
显示module目录下所有包含文件的大小。
24.逻辑与、或
与&&
1)if [ $str=a -a $str=b ]
2)if [ $str=a ] && [ $str=b ]
或||:
1)if [ $str=a -o $str=b ]
2)if [ $str=a ] || [ $str=b ]
25.将一个文件拆分成多个文件
csplit
命令:按照匹配来拆分教程
这是自己写的一个代码测试样例:
csplit 1i32_out.pdbqt /MODEL/ -n2 {*} -f model -b "%02d.pdbqt"
注:
1i32_out.pdbqt
:想要拆分的文件夹;
/MODEL/
:指定拆分所匹配的字符;如果按行数,或者文件的大小(多少k)需要用split函数;
-n2
:新生成的文件名后缀的数字个数(-n2是两位数);指定分割后的文件名后缀的数字个数。比如01、02、03等;
{*}
#表示根据匹配重复执行分割,直到文件尾停止,使用{整数}的形式指定分割执行的次数;
-b "%02d.pdbqt"
:指定后缀格式,比如%02d.log,类似于C语言中的printf参数格式。
-f model
:指定分割后的文件的名字(这个是以model命名);注:这个里面是可以添加目录的;如:-f “result/model”
不过这个需要有一个前提,就是要有这个result文件夹(提前mkdir result
),不然没有的话他不会自己给你创建的
- 如何将上面的三个小档案合成一个档案,档名为 termcapback
cat termcap* >> termcapback
split替代方法:
- 1.用shell数组实现
#!/bin/bash str="hello,world,i,like,you,babalala"
arr=(${str//,/ })
for i in ${arr[@]}
do echo $i
done
注:当字符串短(分隔字符不超过1000)的时候,速度还可以容忍。当分隔字符上千时速度有点无法忍受了。原因可能是shell数组性能差导致。
- 2.用shell 中sed替换分隔符来循环打印
#!/bin/bash str="hello,world,i,like,you,babalala"
for i in `echo "$str" | sed 's/,/\n/g'`
do echo $i
done
注:当字符串中分隔符少时和上面的实现没什么大的速度差别,当字符串中分隔上千时这个实现比上一个快很多倍。
- 3.用shell中awk
#!/bin/bashstr="hello,world,i,like,you,babalala"
echo $str | awk -F',' '{for( i=1;i<NF; i++ ) print $i}'
注:这个方法简单,效率也不错。
26.删除一个文件的每行的前几个字符
sed -i 's/^..//' file.txt
使用了sed的正则替换命令,格式为 s/A/B/
其中,A为正则表达式,^ 匹配行首位置,点号 . 匹配任意一个字符。
这里即将行首的前两个字符替换为空。
注:也就是几个点代表几个字符
27.提取路径,文件名,格式…
参考教程
28.判断变量是否为空
教程
29.介绍awk-之怎么先按照匹配的内容求其所在的某一列的最值,并且按照符合这个值的匹配另外一列:
awk教程
30.关于VIM中怎么全选复制和一些其他的操作
Vim中如何全选并复制?
(区分大小写!!!)
全部删除:按esc键后,先按gg(到达顶部),然后dG
全部复制:按esc键后,先按gg,然后ggyG
全选高亮显示:按esc键后,先按gg,然后ggvG或者ggVG
单行复制:按esc键后, 然后yy
单行删除:按esc键后, 然后dd
粘贴:按esc键后, 然后p
vim只能粘贴50行的问题:
在当前用户主目录()编辑/.vimrc(如果不存在,新建这个文件),添加一行
:set viminfo='1000,<500
至于为什么要输入输入’1000,这个其实不重要,最主要的是输入<500,它是设置寄存器保存的行数的。即最大值为 500
批量注释
1,在命令行模式下,将光标固定在第一列,按Ctrl+V快捷键进入VB可视化模式:
上下移动光标,选择你想要注释的行:
选择好之后,按大写的I键进入insert模式,输入注释符“#”:
最后按ESC键(两次),选择的多行已经注释掉啦
取消多行注释时同样重复Step1-Step2,但此时光标选中注释符,并选好行数之后。只需按d键(小写),注释就被删除啦
如何取消vim粘贴时自动注释功能
vim在粘贴内容的时候,如果遇到以#开始的注释行,会自动将后续的所有行进行注释。也许这个功能在某些情况下是很有用的,但很多时候是不需要的,需要取消这个默认的功能。
取消这个功能也很简单,只需要在根目录下编辑.vimrc文件(如果没有,就创建该文件),在其中添加下面的内容:
set paste
保存即可。
31.只输出某一列
cat content | awk '{print $2}'
#输出内容的第二列
32.怎么一列一列的增加数据
1、如果单纯的打印增加一个数就简单些,比如a.txt第二列要增加100.
cat a.txt|awk '{print $2+100}'
2、如果想增加后值后写入原文件或保存成另一个文件
cat a.txt|awk '{print $1" "$2+100}' > b.txt
33.用获取某几行内容
awk:
教程
输出文件第二行到第四行:
awk "NR==2,NR==4"
【一】从第3000行开始,显示1000行。即显示3000~3999行
cat filename | tail -n +3000 | head -n 1000
【二】显示1000行到3000行
cat filename| head -n 3000 | tail -n +1000
*注意两种方法的顺序
分解:
tail -n 1000:显示最后1000行
tail -n +1000:从1000行开始显示,显示1000行以后的
head -n 1000:显示前面1000行
【三】用sed命令
sed -n ‘5,10p’ filename 这样你就可以只查看文件的第5行到第10行。
【四】用grep命令
grep -C 5 foo filename 显示file文件中匹配foo字符串那行以及上下5行
grep -B 5 foo filename 显示foo及前5行
grep -A 5 foo filename 显示foo及后5行
34.在shell中进行运算
参考:https://www.cnblogs.com/imzhi/articles/13211728.html
num1=3;num2=4
sum=$[num1+num2]
echo $num1 $num2 $sum
#3 4 7
加法运算正确,变量使用或不使用$来访问都是可以的,加号两边可以有空格,也可以没有空格。
35.linux中的vim在编写文本的时候异常中断了,每次打开都会有一些烦人的提示
选择任何一项都会进入到vim编辑器。但你退出后再次进入 仍然回存在相应的提示信息
原因是 vim异常中断时候 会将我们的修改保存在一个缓存文件中(.swp)。因为文档与缓存文档不一致 所以 每次进入都会提示信息。
异常中断除了产生了swp文件 还有可能有swo文件
解决办法:
1 打开缓存文件 将其保存退出 然后删除缓存文件。2 如果想要忽略上次修改的内容 可以直接删除缓存文件即可
36.关于sed,怎么替换一整行
教程
37.删除最后一行,第一行
//filename 文件名
- 删除最后一行
sed -i '$d' filename
- 删除第一行
sed -i '1d' filename
- 删除文件最后一列:
awk '{print $NF}' filename
38.针对浮点数的运算以及比较
有一个链接讲的比价好的计算方法,例子:
教程
bash本身并不支持浮点数,它将浮点数当成一个字符串来处理。由于某种原因,需要在脚本里面比较两个浮点数,遇到了一些麻烦:
\#!/bin/sha=14.23
b=9.12if [[ $a < $b ]] ; thenecho "a < b"
elseecho "a > b"
fi
上面的脚本正常情况下应该显示 a>b,但是实际上却显示a
浮点数的比较(运算)应该使用 bc 才可以得到正确的结果,如下:
\#!/bin/sha=14.23
b=9.12c=$(echo "$a>$b"|bc) #当 a>b时,c=1;否则,c=0
if [[ $c -eq 0 ]] ; thenecho "a < b"
elseecho "a > b"
fi
bc的用法很多,详细的说明参考man bc。
例子:
$if [ $(echo "$mya <= 4"|bc) = 1 ];
then echo "ok"
else echo "fail"
fi
#判断一个浮点数是不是小于4
39.用Typora插入数学公式
教程链接:
教程一
教程二
40.数组的使用方法
- 数组的定义
何为数组?学过计算机编程语言的同学都知道,数组的特性就是一组数据类型相同的集合(不包括有一些编程语言提出来的关联数组的概念)。那么shell中数组是怎么定义的呢,我们来看两种数据类型:一是数值类型,二是字符串类型;虽然shell本身是弱类型的,但也可以这么区分。
- 数值类型的数组:
一对括号表示数组,数组中元素之间使用“空格”来隔开。
- 举个列子:
arr_number=(1 2 3 4 5);
- 字符串类型数组:
同样,使用一对括号表示数组,其中数组中的元素使用双引号或者单引号包含,同样使用“空格”来隔开。
arr_string=("abc" "edf" "sss"); 或者 arr_string=('abc' 'edf' 'sss');
- 数组的操作
我们使用数值类型数组arr_number=(1 2 3 4 5)做为源数组进行相关的讲解:获取数组长度,读取某个下标的值,对某个下标赋值,删除、分配和替换以及遍历。提一个知识点,我们在shell里面想获取某个变量的值,使用
$
符开头,如:$a
或者${a}
即可。
- 获取数组长度
arr_length=${#arr_number[*]}
或${#arr_number[@]}
均可,即形式:${#数组名[@/*]}
可得到数组的长度。
- 读取某个下标的值
arr_index2=${arr_number[2]}
,即形式:${数组名[下标]}
- 追加元素
因为shell 数组没有追加函数,所以呢:
利用数组的长度来追加元素
获取数组的长度:${#arr[*]}
arr[${#arr[*]}]=追加的元素
for var in ${arr[@]}
doecho "打印的内容:"$var
done
- 对某个下标赋值
这里需要提出两个问题:
第一个问题是如果该下标元素已经存在,会怎么样?
答:会修改该下标的值为新的指定值。
例如:arr_number[2]=100,数组被修改为(1 2 100 4 5)
第二个问题是如果指定的下标已经超过当前数组的大小,如上述的arr_number的大小为5,指定下标为10或者11或者大于5的任意值会如何?
答:新赋的值被追加到数组的尾部。
例如:arr_number[13]=13,数组被修改为(1 2 100 4 5 13)
- 删除操作
清除某个元素:
unset arr_number[1]
,这里清除下标为1的数组;
清空整个数组:unset arr_number
;
- 分片访问
分片访问形式为:
${数组名[@或*]:开始下标:结束下标}
,注意,不包括结束下标元素的值。
例如:
${arr_number[@]:1:4}
,这里分片访问从下标为1开始,元素个数为4。
- 模式替换
形式为:
${数组名[@或*]/模式/新值}
例如:
${arr_number[@]/2/98}
- 数组的遍历
数组遍历我们使用for语句来演示:
for v in ${arr_number[@]}; doecho $v;
done
41.printf简介,可以作为输出,输入标准化格式
使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等
教程链接
42. 判断两个字符串是否相等
使用
=
或者==
即可,具体怎么操作直接看一下教程:
字符串相等教程
43. 在一行一行的读取文件的内容的时候,又时会遇到空格,那么空格就会被当做换行符来处理
先说解决方法吧:
IFS_old=$IFS
IFS=$'\n'
for line in `cat rollback_config`;do
echo "$line"
done;
IFS=$IFS_old
** IFS的默认值为:空白(包括:空格,制表符,换行符).**
具体的也不赘述了,直接就看一下教程吧:
逐行处理文件的问题教程
44.查看某一行(最后一行)
cat a.txt | awk 'END {print}'
sed -n '$p' a.txt
tail -1 a.txt
45.关于zip格式的压缩与解压
#liunx服务器上默认没有安装zip命令,所以使用时需安装:
apt-get install zip
或
yum install zip#linux安装unzip命令:
apt-get install unzip
或
yum install unzip
压缩解压教程
压缩命令:
#将/home/Blinux/html/ 这个目录下所有文件和文件夹打包为当前目录下的html.zip
zip –q –r html.zip /home/Blinux/html #上面的命令操作是将绝对地址的文件及文件夹进行压缩.以下给出压缩相对路径目录
#比如目前在Bliux这个目录下,执行以下操作可以达到以上同样的效果.
zip –q –r html.zip html #比如现在我的html目录下,我操作的zip压缩命令是
zip –q –r html.zip *
#以上是在安静模式下进行的,而且包含系统文件和隐含文件
解压命令:
unzip file.zip
46.查看文件夹以及文件的大小,数目
ls -laths
47.查看文件的某行以及附近的几行
参考:https://www.cnblogs.com/xyhui/archive/2012/10/22/2734007.html
使用grep -A, -B and -C显示之前、之后、前后的几行
1.显示匹配之后的n行
-A
语法:
grep -A “string” FILENAME
例:
grep -A 3 -i "example" demo_text
注:用 grep -i 进行大小写无关的搜索
2.显示匹配行之前的N行
-B
语法:
grep -B “string” FILENAME
例:
grep -B 2 "single WORD" demo_text
3.显示匹配行前后的N行
-C 显示之前的n行,之后的n行数据.
例:
grep -C 2 "Example" demo_text
4.使用grep -v进行不匹配
可以使用-v选项显示不匹配搜索字串的行。下例显示demo_text文件中不包含“go”的行
grep -v "go" demo_text
5.用grep -c 统计匹配的行数
语法:
grep -c “pattern” filename
$ grep -c "go" demo_text
6
统计不匹配的行数
$ grep -v -c this demo_file
4
48.判断字符串包含关系
参考链接:https://www.cnblogs.com/AndyStudy/p/6064834.html
strA="helloworld"
strB="low"
if [[ $strA =~ $strB ]]
thenecho "包含"
elseecho "不包含"
fi
49.以逆序打印行
测试文本内容如下:
cat textfile
hadoop hdfs yarn spark zookeeper
mapreduce hive hbase scala kafka
CHAVIN mysql PostgreSQL mongodb
192.168.100.231 192.168.100.232
192.168.10.23
CHAVIN mysql linux hadoop spark hive
mysql CHAVIN hadoop linux spark hbase
mysql mysql mysql mysql mysql mysql
现在以逆序形式显示上面文本:
tac textfile
mysql mysql mysql mysql mysql mysql
mysql CHAVIN hadoop linux spark hbase
CHAVIN mysql linux hadoop spark hive
192.168.10.23
192.168.100.231 192.168.100.232
CHAVIN mysql PostgreSQL mongodb
mapreduce hive hbase scala kafka
hadoop hdfs yarn spark zookeeper
总结:这里使用tac逆序打印行,细心的人能注意到:tac就是反过来的cat命令。tac默认的行分界符是\n,我们可以通过参数-s “分解符”指定行分界符。
这个功能也可以通过awk实现:
awk '{ lifo[NR]=$0 }END{ for(lno=NR;lno>0;lno--){print lifo[lno]}}' textfile
如果将行逆序,同时将行字段逆序方法如下:
awk '{ lifo[NR]=$0 }END{ for(lno=NR;lno>0;lno--){print lifo[lno]}}' textfile | awk '{ for(i=NF;i>0;i--){if(i==1){print $i}else{printf $i","}fi}}'
50.对于大文件,怎么删除第一行最后一行比较快
删除最后一行:
head -n -1 $file > temp.txt ; mv temp.txt $file;
删除第一行和第二行:也就是输出数据,从第三行开始:
tail -n +3 $file > temp.txt;mv temp.txt $file;
51、Linux系统下每次打开终端自动进入base环境
问题描述
安装anaconda或miniconda后,每次打开Linux系统的终端会自动激活base环境。
原因分析
安装anaconda或miniconda的时候,选择了每次打开终端后自动激活base环境。
解决方案
conda配置里面设置取消自动激活base环境:
conda config --set auto_activate_base false
引用参考
https://stackoverflow.com/questions/54429210/how-do-i-prevent-conda-from-activating-the-base-environment-by-default
52、安装anaconda或miniconda后,每次打开Linux系统的终端会自动激活base环境。
conda配置里面设置取消自动激活base环境:
conda config --set auto_activate_base false
53、查看隐藏的文件
#显示所有文件(包含隐藏文件)
ls -a
#或者
ls -la
#只显示隐藏文件
l.
#或者
ls -d .*
54、if判断条件的写法
关于文件属性的判断式
-a 如果文件存在-b 如果文件存在,且该文件是区域设备文件-c 当file存在并且是字符设备文件时返回真-d 当pathname存在并且是一个目录时返回真-e 当pathname指定的文件或目录存在时返回真-f 当file存在并且是普通文件时返回真-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效-k 当由pathname指定的文件或目录存在并且设置了“sticky”位时返回真-r 当由pathname指定的文件或目录存在并且可读时返回为真-s 当file存在文件大小大于0时返回真-t 文件描述符 如果文件描述符是开启的,且链接了某一个终端-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真-w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。-x 如果文件存在,且该文件有可执行的属性-O 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。-G 如果文件存在,且该文件为有效的群组 id 所拥有-L 如果该文件存在,且该文件是符号链接文件-S 如果该文件存在,且该文件是Socket文件-N 如果该文件存在,且该文件自上次读取后曾修改过文件1 –nt 文件2 如果文件1比文件2新,或者文件1存在,文件2不存在文件1 –ot 文件2 如果文件1比文件2旧,或者文件1不存在,文件2存在文件1 –ef 文件2 如果文件1和文件2 引用到相同的设备和 inode 编号
关于字符串的条件判断式
-z 空串 (如果字符串长度为0)-n 非空串 (如果字符串长度不为0)字符串 如果字符串长度不为0!= 如果两个字符串不相等 = 如果两个字符串相等== 如果两个字符串相等字符串 1 < 字符串 2 如果字符串1小于字符串2字符串 1 > 字符串 2 如果字符串1大于字符串2
关于算式的条件判断
-eq 等于-ne 不等于-gt 大于-lt 小于-le 小于等于-ge 大于等于
55、怎么获取一个路径的情况下的,文件名字
basename $path
56、判断字符串是否包含一些字符串
https://www.cnblogs.com/sssblog/p/10273148.html
1.使用grep
s1="abcdefg"
s2="bcd"
result=$(echo $s1 | grep "${s2}")
if [[ "$result" != "" ]]
thenecho "$s1 include $s2"
elseecho "$1 not include $s2"
fi
- 使用操作符~
fileName=/home/sss/data/hkif [[ $fileName =~hk ]]
thenecho "$fileName include hk"
elseecho "not include"
fi
- 使用通配符*
A="helloworld"
B="low"
if [[ $A == *$B* ]]
thenecho "包含"
elseecho "不包含"
fi
57、怎么获取当前路径的上一层路径
path=
dirname $(pwd)``
58、awk
使用正则,字符串匹配
log.txt
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
# 输出包含 "re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo
实例:
awk '$1=="ATOM" && $3 ~ /H/ {print $3}' 1u9q.pdbqt
查看分子文件中以ATOM
开头,第三列的原子是H
原子(每个原子都有序号)的个数
59、小数运算
11111111
shell中的小数运算
最近在做MySQL性能指标监控,通过shell脚本计算innodb buffer pool的命中率。
编写脚本时,遇到了bash小数计算的瓶颈。
网上查找,发现bash不支持小数运算,小于0的结果输出都为0。
不支持小数预算
a=$[1+0.2]
-bash: 1+0.2: syntax error: invalid arithmetic operator (error token is “.2”)
#小于0的结果输出都为0
a=$[779063181/9968741715*100]
echo $a
0
解决办法:使用bc进行浮点预算。
其中,scale表示小数点后面有3位
a=
echo "scale=2;779063181/9968741715"|bc
echo $a
.07
60、怎么打印从某一列到最后一列
awk -F " " '{for (i=2;i<=NF;i++)printf("%s ", $i);print ""}' file
awk '{for(i=2;i<=NF;i++)print $i}' a.txt
awk '{for(i=2;i<=NF;i++)printf("%s ",$i)}' a.txt
n=`awk '{for(i=2;i<=NF;i++)printf("%s ",$i)}' a.txt`
for j in ${n[*]}
do echo $j
done
61、关于sort()排序
sort:可以实现依据不同的数据类型进行排序,其语法及常用参数格式如下:
sort [-bcfMnrtk][源文件][-o 输出文件]补充说明:sort可针对文本文件的内容,以行为单位来排序。 参 数:-b 忽略每行前面开始出的空格字符。-c 检查文件是否已经按照顺序排序。-f 排序时,忽略大小写字母。-M 将前面3个字母依照月份的缩写进行排序。-n 依照数值的大小排序。-o<输出文件> 将排序后的结果存入指定的文件。-r 以相反的顺序来排序。-t<分隔字符> 指定排序时所用的栏位分隔字符。-k 选择以哪个区间进行排序。
1 sort的工作原理
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
[root@gitlab ~]$ cat seq.txt
banana
apple
pear
orange
pear
[root@gitlab ~]$ sort seq.txt
apple
banana
orange
pear
pear
2 sort的-u选项
它的作用很简单,就是在输出行中去除重复行。
[root@gitlab ~]$ sort -u seq.txt
apple
banana
orange
pear
pear由于重复被-u选项无情的删除了。
3 sort的-r选项
[root@gitlab ~]$ cat number.txt
1
3
5
7
11
2
4
6
10
8
9
[root@gitlab ~]$ sort number.txt --sort默认的排序方式是升序
1
10
11
2
3
4
5
6
7
8
9
[root@gitlab ~]$ sort -n number.txt --排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面
1
2
3
4
5
6
7
8
9
10
11
[root@gitlab ~]$ sort -n -r number.txt --r表示降序,n表示按数字进行排序
11
10
9
8
7
6
5
4
3
2
1
4 sort的-o选项
由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile。
但是,如果你想把排序结果输出到原文件中,用重定向就需要使用追加的方式。
[root@gitlab ~]$ sort -n -r number.txt > number.txt
[root@gitlab ~]$ cat number.txt
[root@gitlab ~]$
number清空了。所以我们需要使用-o选项,它成功的解决了这个问题,让你放心的将结果写入原文件。这或许也是-o比重定向的唯一优势所在。[root@gitlab ~]$ sort -n -r number.txt -o number.txt
[root@gitlab ~]$ cat number.txt
11
10
9
8
7
6
5
4
3
2
1
5 sort的-t选项和-k选项
[root@gitlab ~]$ cat facebook.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4
[root@gitlab ~]$ sort -n -k 2 -t : facebook.txt
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3
这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实现?幸好,sort提供了-t选项,后面可以设定间隔符。(是不是想起了cut和paste的-d选项,共鸣~~)
指定了间隔符之后,就可以用-k来指定列数了。我们使用冒号作为间隔符,并针对第二列来进行数值升序排序,结果很令人满意。
6 其他的sort常用选项
-f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1-M会以月份来排序,比如JAN小于FEB等等-b会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。
62、关于使用nohup
提交到后台以后如何成功的杀死进程
方法1:
如果没有退出客户端界面,可以先通过
“jobs”
命令查看程序是否在运行,此时只有序号没有PID号;
输入命令“jobs -l”
会显示程序的PID号,然后通过“kill -9 PID”
杀死程序;
输入命令“jobs”
查看程序是否被杀死。
方法2:
如果退出过客户端界面,输入
“jobs”
命令查不到正在运行的程序;
输入“ps ux”
来查看所有程序的进程号PID,然后再通过“kill -9 PID”
杀死程序;
输入“ps ux”
来查看程序是否被杀死。
如果你知道你提交的相关的名字也是可以查询到的:"ps ux | grep code.sh"
63、关于在服务器中Top
命令的参数了解
参考:参考一个博主的链接
64、basename
了解
首先使用 –help 参数查看一下。 basename命令参数很少,很容易掌握。
$ basename --help
用法示例:
$ basename /usr/bin/sort 输出"sort"。$ basename ./include/stdio.h .h 输出"stdio"。# 为basename指定一个路径,basename命令会删掉所有的前缀包括最后一个slash(‘/’)字符,然后将字符串显示出来。
basename命令格式:
basename [pathname] [suffix]
basename [string] [suffix]
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
示例:
$ basename /tmp/test/file.txt
file.txt
$ basename /tmp/test/file.txt .txt
file
注意点:
1、如果像下面脚本中传递参数给basename,参数为空,basename会将参数左移
2、basename最多接受两个参数,如果设置的参数多于两个,会提示错误。
参考:http://en.wikipedia.org/wiki/Basename
以下是一个简单的脚本,测试了一下basename:
#!/bin/bash
# basename.sh
echo Testing basename
echo -------------
echo "basename \$1/\$2 .txt; suffix is .txt"
filename=`basename $1/$2 .txt`
echo $filename
echo -------------
echo "basename ab.c .c; suffix is .c"
basename ab.c .c
echo "basename ab b; suffix is b"
basename ab b
echo -------------
echo Testing \$\@ and \$\#
echo Output \$\@
echo $@
echo Output \$\#
echo $#
# end of basename.sh
脚本运行结果:
没有参数传递的情况:
$./basename.sh
Testing basename
-------------
basename $1/$2 .txt; suffix is .txt
/
-------------
basename ab.c .c; suffix is .c
ab
basename ab b; suffix is b
a
Testing $@ and $#
-------------
Output $@Output $#
0传递参数的情况:$ ./basename.sh 1.txt 2.txt
Testing basename
------------
basename $1 .txt; suffix is .txt
1
-------------
basename ab.c .c; suffix is .c
ab
basename ab b; suffix is b
a
Testing $@ and $#
-------------
Output $@
1.txt 2.txt
Output $#
2
额外补充:
1、$@
$@ 为传递的参数
2、$#
$# 为传递参数的数量
就像脚本执行后的结果:
Testing $@ and $#
-------------
Output $@
1.txt 2.txt
Output $#
2
3、$?
是shell变量,表示"最后一次执行命令"的退出状态,一般0表示成功,非0数值表示没有成功。
切记:
$?永远表示shell命令最后一次执行后的退出状态,当函数执行完毕后,如果又执行了其它命令,则 $?不再表示函数执行后的状态,而表示其它命令的退出状态.
4、$!
代表pid,进程id
5、$$
代表ppid,父进程id
$ ./skype &
[2] 13549
$ echo $!
13549
$ echo $$
13032
$ ps -ef | grep skype
luck 13549 13032 4 19:19 pts/0 00:00:00 skype
出处:https://blog.csdn.net/wutao_water/article/details/39478631
65、怎么取出文件名,不要后缀
代码:
file=”thisfile.txt”
echo “filename: ${file%.*}”
echo “extension: ${file##*.}”
输出:
filename: thisfile
extension: txt
基于Pattern Matching的子串替换
${STR/$OLD/$NEW}
替换第一个。
${STR//$OLD/$NEW}
替换所有。
注意:不能使用正则表达式,只能使用?*的Shell扩展。只能用shell通配符如 * ?
[!list] [a-z]。
${STR/#$OLD/$NEW}
替换开头。如果STR以OLD串开头,则替换。
${STR/%$OLD/$NEW}
替换结尾。如果STR以OLD串结尾,则替换。
[user@laptop ~]# STR=”Hello World”
[user@laptop ~]# echo ${STR/o/O}
HellO World
[user@laptop ~]# echo ${STR//o/O}
HellO WOrld
[user@laptop ~]# STR=”Hello World”
[user@laptop ~]# echo ${STR/#He/he}
hello World
[user@laptop ~]# echo ${STR/#o/he}
Hello World
[user@laptop ~]# echo ${STR/%He/he}
Hello World
[user@laptop ~]# echo ${STR/%ld/lD}
Hello WorlD
如果被替换串包含/字符,那么要转义,写成\/。
[user@laptop ~]# filename=”/user/admin/monitoring/process.sh”
[user@laptop ~]# echo ${filename/#\/user/\/tmp}
/tmp/admin/monitoring/process.sh
[user@laptop ~]# echo ${filename/%.*/.ksh}
/user/admin/monitoring/process.ksh
[user@laptop ~]#
将环境变量PATH的各个目录分开,每行显示一个。
echo -e ${PATH/:/\n}
[user@laptop ctmw]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/apache/apache-ant-1.7.1/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/user/bin
[user@laptop ctmw]# echo -e ${PATH//:/’\n’}
/usr/kerberos/sbin
/usr/kerberos/bin
/usr/apache/apache-ant-1.7.1/bin
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/user/bin
[user@laptop ctmw]# echo “${PATH//:/$’\n’}”
/usr/kerberos/sbin
/usr/kerberos/bin
/usr/apache/apache-ant-1.7.1/bin
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/user/bin
基于Pattern Matching的子串删除
子串删除是一种特殊的替换
${STR/$SUB}
将STR中第一个SUB子串删除
${STR//$SUB}
将STR中所有SUB子串删除
${STR#$PREFIX}
去头,从开头去除最短匹配前缀
${STR##$PREFIX}
去头,从开头去除最长匹配前缀
${STR%$SUFFIX}
去尾,从结尾去除最短匹配后缀
${STR%%$SUFFIX}
去尾,从结尾去除最长匹配后缀
注意:经常会记错#和%的含义,有一个帮助记忆的方法
看一下键盘,#在$之前,%在$之后,就知道#去头,%去尾。
注意:不能使用正则表达式,只能使用?*的Shell扩展。
[user@laptop ~]# STR=”Hello World”
[user@laptop ~]# echo ${STR#He}
llo World
[user@laptop ~]# echo ${STR#He*o}
World
[user@laptop ~]# echo ${STR##He*o}
rld
[user@laptop ~]# PREFIX=”*o”
[user@laptop ~]# echo ${STR#$PREFIX}
World
[user@laptop ~]# echo ${STR##$PREFIX}
rld
[user@laptop ~]# echo ${STR%o*}
Hello W
[user@laptop ~]# echo ${STR%%o*}
Hell
[user@laptop ~]# SUFFIX=”o*”
[user@laptop ~]# echo ${STR%$SUFFIX}
Hello W
[user@laptop ~]# echo ${STR%%$SUFFIX}
Hell
典型应用:得到文件的扩展名
[user@laptop ~]# FILE=hello.jpg
[user@laptop ~]# echo ${FILE##*.}
jpg
使用sed命令实现正则表达式替换
使用sed命令可以进行正则表达式的替换。
echo “$STR” | sed “s/$OLD/$NEW/”
将STR中的OLD子串替换成NEW。
[user@laptop ~]# STR=”123456789″
[user@laptop ~]# echo “$STR” | sed s/345/OK/
12OK6789
[user@laptop ~]# OLD=345
[user@laptop ~]# NEW=OK
[user@laptop ~]# echo “$STR” | sed “s/$OLD/$NEW/”
12OK6789
使用tr命令实现字符集合的替换
使用tr命令可以实现字符的替换,并且可以是从一批字符到另一批字符的替换。比如小写字母变成大写字母,或者反过来。
[user@laptop ~]# echo “bash” | tr “[a-z]” “[b-z]”
cbti
上面的命令是将原串中的a替换成b,被替换成c,以此类推。
网上问题:Linux中 有没有一个命令可以将 字符串中出现的 +或者- 替换成对应的-或者+ 即 “+” ——> “-” “-”——>”+” 例如 GMT+8-9变成 GMT-8+9
[user@laptop ~]# echo “GMT+8-9″ | sed ‘s/-/#/g’ | sed ‘s/+/-/g’ | sed ‘s/#/+/g’
GMT-8+9
上面是网上提供的答案。如果用tr来实现,更简洁些。
[user@laptop ~]# echo “GMT+8-9″ | tr “+-” “-+”
GMT-8+9
路径字符串的处理
dirname ${FULLPATH}
取目录部分。
basename ${FULLPATH}
取文件名部分。
basename ${FULLPATH} ${EXT}
取文件名部分,并且去掉指定的扩展名。
[user@laptop ~]# FULLPATH=/user/work/project/backup.tar.gz
[user@laptop ~]# dirname “$FULLPATH”
/user/work/project
[user@laptop ~]# basename “$FULLPATH”
backup.tar.gz
[user@laptop ~]# basename “$FULLPATH” .gz
backup.tar
[user@laptop ~]# basename “$FULLPATH” .tar
backup.tar.gz
[user@laptop ~]# basename “$FULLPATH” .tar.gz
backup
取目录部分:${FULLPATH%/*}
(类似 dirname “$FULLPATH”)
取文件名称:FILE=${FULLPATH##*/}
(类似 basename “$FULLPATH”)
取最短基本名称:${FILE%%.*}
取最长基本名称:${FILE%.*}
取最短扩展名:${FILE##*.} 或者 ${FULLPATH##*.}
取最长扩展名:${FILE#*.} 或者 ${FULLPATH#*.}
[user@laptop ~]# FULLPATH=/user/work/project/backup.tar.gz
[user@laptop ~]# echo ${FULLPATH%/*}
/user/work/project
[user@laptop ~]# dirname “$FULLPATH”
/user/work/project
[user@laptop ~]# FILE=${FULLPATH##*/}
[user@laptop ~]# echo $FILE
backup.tar.gz
[user@laptop ~]# basename “$FULLPATH”
backup.tar.gz
[user@laptop ~]# echo ${FILE%%.*}
backup
[user@laptop ~]# echo ${FILE%.*}
backup.tar
[user@laptop ~]# echo ${FILE##*.}
gz
[user@laptop ~]# echo ${FILE#*.}
tar.gz
[user@laptop ~]#
66、变量的名称来源于另一个变量的值
[root@hadoop ~]# name=me
[root@hadoop ~]# name="me"
[root@hadoop ~]# me="hongrao"第一种方法
[root@hadoop ~]# eval echo \$$name
hongrao第二种方法,bash2.0
[root@hadoop ~]# echo ${!name}
hongrao
67、怎么用qsub
提交命令里面添加参数
qsub -v protein_path=$onepath,ligand_path=$ligand_path,result_path=$result_path,num=$num test.sh
68、怎么获取从第一行到某一行
#获取前74行
awk 'NR<75{print}' file.txt
awk 'NR==1,NR==74{print}' file.txt
head -n +74 file.txt
sed -n '1,74p' file.txt
当然最快的我觉着还是前面的三个方法,最后一个比较慢。
69、多行注释
- 单行注释
众所周知 # , 比如想要注释 echo “Hello World”
[root@Jaking ~]# vim test.sh
# echo "Hello World"
- 多行注释:
法一:注意后面的`!`要放在
: << !
语句1
语句2
语句3
语句4
!
法二:
: '
语句1
语句2
语句3
语句4
'
70、关于判断中的多个条件(或,与)
1.如果a>b且a<c
if (( a > b )) && (( a < c ))
#或者
if [[ $a > $b ]] && [[ $a < $c ]]
#或者
if [ $a -gt $b -a $a -lt $c ]
注意:使用
&&
是要将两个条件独立出来的,可以跑一下,试一下;
注意空格
的使用,一般是在if
后面有空格,在每个运算符的两边也是需要有空格的;
2.如果a>b或a<c
if (( a > b )) || (( a < c ))
#或者
if [[ $a > $b ]] || [[ $a < $c ]]
#或者
if [ $a -gt $b -o $a -lt $c ]
注意点和上面是一样的;
-o = or
,-a = and
4."||“和”&&"在SHELL里可以用吗?也就是第一个写成if [ a>b && a<c ]也可以吗?
答:可用, 但是要两个独立的 [ ] , [[ ]] 或 (( ))
5
-ne
比较数字 (numberic) ;!=
比较字符 (string), 但后者拿来
比较数字也可,只是不是标准用法
-lt
是等同 < , 但 < 只能在 shell 的数值操作符 (( )) 或
者 逻缉操作符 [[ ]] 才可使用,-lt
,-eq
,-gt
,-ge
-le
, 这些是 test , 就是 [ ] 这个内建命令使用的条件操
作符, 数字用,=
,!=
;字符用==
这个该是 [[ ]] 用的,
可用来比对正规表示式, 但用在 [ ] 也可,只是不太正统用法
71、怎么使用awk
用多个条件来选择
代码示例:
awk -F "," '$1=="1ao8" || $1=="1a4q" {print}' qvina2_score_RMSD.csv
#或者
target1="1ao8"
target2="1a4q"
selfScore=`awk -F "," '$1=="'$target1'" || $1=="'$target2'" {print $2}' $self_path`
找第一列的值为"1ao8"和"1a4q"的内容;
72、比较全的调度命名–PBS
–qsub
教程:https://blog.csdn.net/kunxitoothache/article/details/109897918
73、输出序列化seq
seq(squeue) 是一个序列的缩写,主要用来输出序列化的东西
用法: seq[选项]… 尾数
seq[选项]… 首数 尾数
seq[选项]… 首数 增量 尾数
以指定增量从首数开始打印数字到尾数
-f, # –format=格式 使用printf样式的浮点格式 后面跟的 “%0.3g”
-s, #–separator=字符串 使用指定字符串分隔数字(默认使用: \n)
-w, # –equal-width 在前列填充0使得宽度相同(自动补位)
–help 显示此帮助信息并退出
–version 显示版本信息并退出
%g用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),
且不输出无意义的0。即%g是根据结果自动选择科学记数法还是一般的小数记数法
对于指数小于-4或者大于给定精度的数值,按照%e的控制输出,否则按照%f的控制输出.
%02g : 02表示不足两位,前面补0输出;超过两位的不影响
[root@localhost seq]# printf "%g" 0.00001234
1.234e-05[root@localhost seq]# printf "%g"^C.00001234
[root@localhost seq]# printf "%g\n" 0.00001234
1.234e-05
[root@localhost seq]# printf "%g\n" 0.0001234
0.0001234
[root@localhost seq]# printf "%.2g\n" 123.45
1.2e+02
[root@localhost seq]# printf "%.2g\n" 23.45
23
[root@localhost seq]# seq 100 #自动生成了一个序列,默认数字间换行(回车)
1
2
3
4
5
6
……
98
99
100
seq -s使用指定字符串分隔数字[root@localhost seq]# seq -s '#' 5
1#2#3#4#5
[root@localhost seq]# seq -s '2' 5
122232425
[root@localhost seq]# seq -s '@' 5
1@2@3@4@5
[root@localhost seq]# seq -s ' ' 5
1 2 3 4 5
[root@localhost seq]# seq -s '' 5
12345
[root@localhost seq]# seq -s '$' 5
1$2$3$4$5
seq -w在前列填充0使得宽度相同(自动补位)
[root@localhost seq]# seq -w 10
01
02
03
04
05
06
07
08
09
10
[root@localhost seq]# seq -w 20
01
02
03
……
18
19
20
[root@localhost seq]# seq -w 100
001
002
003
……
098
099
100
[root@localhost seq]# seq -w 1000
0001
0002
0003
……
0997
0998
0999
1000
seq 首数 增量 尾数
产生-2到10内的整数增量为2
[root@localhost seq]# seq -2 2 10
-2
0
2
4
6
8
10
seq -f "%03g"(C语言的格式化输出) 首数 尾数产生98到101之间的整数,并且要求输出的数字宽度相同,不同的地方使用空格补足[root@localhost seq]# seq -f "%03g" 98 101 ##不够三位补0
098
099
100
101
[root@localhost seq]# seq -f "%3g" 98 1019899
100
101
74、某些字符串的删除(前几个字符、后几个字符…)
参考链接