shell script 经验笔记

一、sed

参考:http://blog.csdn.net/engledb/article/details/19623087

sed 简介

sed逐行处理文件过程:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示,处理完输入文件的最后一行后,sed便结束运行。

sed正则表达式

sed使用的正则表达式是括在斜杠线"/"之间的模式

cat r+bdna.lis | sed -n '/^  (E)/,/^   20.5/p' > 1

抽提以"  (E)"开头到以"  20.5"开头的行的内容,-n 取消默认打印,p 显示模式空间的内容,-n与p同时出现代表只打印模式空间中已匹配的内容。

sed '/^test/a\this is a test line' file

行后追加:将 this is a test line 追加到 以test 开头的行后面,详见参考。

二、AWK

参考http://blog.csdn.net/andyxm/article/details/5964071

awk简介

awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理

awk '{print "a"}'/etc/passwd(输出文件中相同行数的a,更是证明了awk是逐行处理的)

语法

awk '{pattern + action}' {filenames}
awk 'pattern' filename
awk '{action}' filename
awk 'pattern {action}' filename(
参考:http://www.cnblogs.com/mchina/archive/2012/06/30/2571308.html)

man awk : 部分如下

Statements are terminated by newlines,semi-colonsor both. Groups of statements such asactions or loop bodiesare blocked via{ ... } as in C.  The last statement in a block doesn't need  a terminator.   Blank  lines have no meaning; an empty statement is terminated with a semi-colon. Long statements can be continued with a backslash, \.  A statement can be broken without a backslash after a comma, left brace, &&, ||, do, else, the right parenthesis of an if, while or for statement, and the right parenthesis of a function definition.  A  comment  starts  with  #  and extends to, but does not include the end of line.

举例

awk '$1=="ATOM" || $1=="HETATM" || $1=="TER" || $1=="END"' 1D23.pdb > 1D23_clean.pdb

awk '$1=="END" ; {print}'1D23.pdb > 1D23_clean.pdb--> 输出1D23.pdb之所有。这是分号(;semi-colons)所起到的分割作用。两个例子均默认以原格式输出

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

三、sort 命令

来自: http://man.linuxde.net/sort

sort -u sort.txt

sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出,(-u 忽略相同行,可以去重复)

sort -n -k1 g9.dat > sort.dat

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

awk:pattern中的比较与匹配: ==,!= 与 ~,!~

用awk去除相邻两行的重复值,与sort联用可去重
>awk '$1==a {} $1!=a{a=$1;print $1}' 346bdg.dat

只改变第一列的格式或值,第二列保持不变

>awk '$1==$1{printf "%.0f\t", $1} $2==$2{print $2}' bbmg.dat >2

>awk '{$1=($1-1)*0.5}{print $1"\t"$2 }' 1.dat


用awk匹配第一列和第三列只有一列以D开头的行
>cat UU.dat |awk ' $1!~/^D/&& $3~/^D/ ||$1~/^D/&&$3!~/^D/ {print $0 > "r.dat"}'
或cat UU.dat |awk '{if($1!~/^D/&& $3~/^D/||$1~/^D/&&$3!~/^D/) print $0 > "r1.dat"}'
>cat r114.dat |awk '$1!~"@H"&&$1!~"@C"&&$3!~"@C" {print $0 > "r114-2.dat"}'
awk不抽提第2,3列
>awk '{$2=$3="";print}' gr2.dat > gr3.dat。semi-colons分割action。

awk匹配每行单个域内2位及2位以上的数字

>awk '/[0-9][0-9]+/' 1.dat
123 1

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

四、shell——if

>cat DG.dat |awk '{if($2==0) $2="" ;if($2==1) $2="-_@NH";print $0 > "DG12.dat"}'

awk中if后紧跟的print前不用加;?????????????当$2的第一行的值为零时,第一行总是输不出来,原因???

>awk '$1=$1*5*10^-3 {print}' watshellhb.dat > watshellhb-ns.dat

>grep '^ENE:' ../mg.log |awk '$2=$2*10^-6 {if((NR%5==0)) print $2"\t"$7 > "e1.dat"}'

>cat bd.dat |while read line ;do var=${line#*,};var1=${var%f*} ;if(($var1>=2400));then echo $line >> "1";fi;done
-bash: ((: #Bridging Solute Residues:>=2400: syntax error: operand expected (error token is "#Bridging Solute Residues:>=2400")????????????

五、shell——截取字符串

截取每行从左边起第一个逗号往右,以及右边起f往左的内容
cat bd.dat|grep "6:L"|while read line ;do var=${line#*,};echo $var" "${var%f*} >> mg.dat;done

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

>cat -n hbondsmg.dat | awk '{FS=" "} {print $1"\t"$3 > "hbondsmg2.dat"}'
-n: print number of row

把文件里第2,4列相加为一列

>cat 33.dat |awk '{printFNR"\t"$2+$4 > "44.dat"}'

改变输出域分隔符(OFS)
>awk 'BEGIN{OFS=" "; print "No. W12,W21" > "t8sort1.dat"}{print $1,$5,$6 >> "t8sort1.dat"}' t8sort.dat   (得加分号)
>awk 'BEGIN{OFS=" "} {print "No. W12,W21" > "t8sort1.dat"}{print $1,$5,$6 >> "t8sort1.dat"}' t8sort.dat   (没有分号,每行都有No. W12,W21)

awk抽提第10至第15行
>awk 'NR>=10 && NR<=15' (只有pattern,默认会action{print})

awk每隔5行抽提

>awk 'NR%5==0' elec-100-150.dat >e.dat

替换文件某列的值
>awk '$4="XXX"' 0E8_clean_H.pdb > XXX.pdb

man awk——Builtin-variables

NR: current record number in thetotal input stream

FNR: current record number in FILENAME.一行一个record.

NF: number of fields in the current record.

FS: splits records into fields as a regular expression.

OFS: inserted between fields on output, initially = " ".

RS: input record separator, initially = "\n"

ORS: terminates each record on output, initially = "\n".

##################################

BEGIN/END

参考http://151wqooo.blog.51cto.com/2610898/1309851

BEGIN模块后紧跟着的动作块在awk处理任何输入文件之前执行,所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS,RS和FS等,以及打印标题。而END之后列出的操作将在扫描完全部的输入之后执行。

##################################

AWK——变量

比较下面两个:

>cat 1

123 1
345 2
456 3

>awk 'BEGIN {print "title";totel=0}{print $1;print totel;totel=totel+$1;print totel}END{print totel}' 1

title
123
0
123
345
123
468
456
468
924
924

>awk 'BEGIN {print "title";totle=0}{print $1;print$totle;$totle=$totle+$1;print$totle}END{print$totle}' 1

title
123
123 1
246
345
345 2
690
456
456 3
912
912

总结:awk中可以自定义变量,直接为一个变量赋值就定义了一个变量,比如totel=0。事实上第一次使用变量即可自定义变量,默认值为0,如下所示sum。

awk中变量定义和C是一样的,定义和使用时都不需要加$之类的操作符

(参考http://blog.chinaunix.net/uid-631921-id-2083479.html)

awk中shell传给命令行的变量,需要使用$,''内的代码属于awk来解析的,定义和使用时都不需要使用$。

(参考http://blog.chinaunix.net/uid-631921-id-2083479.html)

自定义变量(参考http://www.jianshu.com/p/ea22c809ae9f)
1.在选项位置定义: -v var=VALUE
2.在program中定义: awk 'BEGIN{test="hello";print test}',变量在program中定义时,需要使用引号。

                或awk '$1="XXX"' 1.dat

事实上对某列求和:

>awk '{print sum+=$1}' 1

#############################################

awk中使用shell 变量

(参考https://zhidao.baidu.com/question/745252363876135132.html)

>var=a
>awk -v m=$var 'BEGIN {print m}'

a(???????)

awk中shell传给命令行的变量,需要使用$,''内的代码属于awk来解析的,定义和使用时都不需要使用$。

>var="test"

>awk 'BEGIN {print "$var"}'

$var(双引号不是应该能解释$吗????照理应该输出test啊??)

>awk 'BEGIN {print"'$var'"}'

test

>var="a test"

>awk -v m="$var" 'BEGIN {print m}'

a test

>awk -v m=$var 'BEGIN {print m}'

awk: cannot open BEGIN {print m} (No such file or directory)

???????????????????

>var="this is a test"

>awk 'BEGIN{print"'"$var"'"}'

this is a test

如果var中含空格,为了shell不把空格作为分隔符,便应该如上使用。

六、shell——单引号和双引号

双引号:只解释(`(命令替换),$(变量替换),\),其余直接输出。

单引号:全部不解释,直接输出。

shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。(注意是所有,只是单引号本身不能够出现在其中)。(参考http://blog.csdn.net/luo6620378xu/article/details/9081417)

#################################

awk匹配对象是一个变量
>v=root
>awk '/'$v'/' /etc/passwd

root:x:0:0:root:/root:/bin/bash

类似于grep "root" /etc/passwd

抽取第一列为>的行

>awk '{if($1==">")print $0 > "tleap.in"}' leap.log

七、grep

grep精确匹配
grep -w "MODEL     $i" -A 94928 ../1dh3.pdb > grep$i.pdb
grep 删除匹配行
grep -vn 'ide-C' > nodna-c-wat.log
-vn : 除了匹配的打印出来,有行号。
grep -o ",338(" bd.dat >& nmbd.dat把文件中所有的,338(抽提出来,并按行列出。
wc  -l nmbd.dat计算行数。

八、简单的shell脚本

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

fp=open('a.sh','w')
print >>fp,"#!/bin/sh"+'\n'
print >>fp,"export CUDA_VISIBLE_DEVICES=0,1"
for i in range(40):
    line = 'mpirun -n 2 pmemd.cuda.MPI -O -i prod.in -o '+' '+str(i+1)+'prod.out -p '+' '+'2pep'+str(i+1)+'-wat.prmtop'+' '#####可以循环迭代400个命令。###
    fp.write(line)
fp.close

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

用curves+计算轨迹pdb中的每帧核酸的结构参数

for((i=1;i<5001;i=i+5))
do
grep -w "MODEL     $i" -A 4000 ./1dh3-mg-75-100ns.pdb > grep$i.pdb
mkdir grep$i
cp  curves ./grep$i
mv grep$i.pdb ./grep$i
cd grep$i
mv grep$i.pdb 1dh3-mg-75-100ns.pdb
. curves
cd ..
done

#########################
九、shell 函数

自定义回收站功能

(参考http://www.jb51.net/LINUXjishu/151035.html

             http://blog.csdn.net/ljianhui/article/details/9333443)

命令:

myrm(){ D=~/.local/share/Trash/files/$(date +%Y%m%d%H%M%S); mkdir -p $D; mv "$@" $D && echo "moved to $D ok"; }

alias rm='myrm'(取消alias : unalias rm)

命令:

参考 https://zhidao.baidu.com/question/646925076041959165.html

>mkdir /tmp/trash_tmp

>vi /bin/trash

mv $@ /tmp/trash_tmp

>vi /etc/bashrc ???????????不知道可否用~/.bashrc??????

(/etc/bashrc 为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取)

在最后一行添加alias rm=/bin/trash?????????????

>chmod 755 /bin/trash
>chmod 777 /tmp/trash_tmp

>source /etc/bashrc
如果要真的删除某个文件的时候用 /bin/rm -i file_name

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值