这次文涉及到的主要是我在使用 linux 系统时会常使用的命令

该文仅作笔记用,如果某些奇思妙想能够帮助到其他人也是挺好的。

screen

执行

在服务器上创造一个如果不终止则将一直存在的终端,不随着关闭自己的终端而消失,而是一直存在于服务器的后台里,并执行其中运行的命令。

常用指令:

1
2
3
4
$ screen -R xxx  # 创建并进入 xxx 终端。
$ screen -r xxx # 进入已有的 xxx 终端。
$ screen -d # 退出当前终端到自己的终端
$ screen -ls # 浏览当前所有创建的终端,如果显示 Detached 则表示不在里面,显示 Attached 则反之。

如果要关闭所创建的终端,建议先进入这个终端看看是否还有命令正在运行,确定没有遗漏后,再在这个终端中输入 exit 退出。

df -h & htop

df -h 可以知道还剩余多少空间

htop 直观展现内存占用情况,可以根据剩余的内存合理地设置软件的相关参数。

nohup

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

除了这个作用以外,它还会输出一个名叫 nohup.out 的文件到当前目录下,这个文件记载了所有该指令本来会有的屏幕输出。

对于在运行时会把有用信息打印在屏幕输出上而不保存在某个文件里的命令(例如 Bowtie2 Trimmomatic 等),都适合在前面加一个 nohup 以进行记录,nohup 不会覆盖已有的 nohup.out,而是会在最后进行 append。

要记录屏幕输出或者改变 nohup 的记录文件也可以通过下列方法实现:

1
$ nohup xxx > out.file 2>&1  # 不加 nohup 也会将屏幕输出记录到 out.file 中

parallel 并行命令

这个命令用到的场景比较少,但到了需要它的时候就会显得格外有用。

例如,要利用大量比对修建后的 fasta 文件通过 iqtree 建树,用 for 循环只能一个一个跑(这种情况下用 & 是不明智的),那么可以这么做:

1
2
3
4
5
6
$ for i in `ls -r *.fasta`;
do
id=${i%%.fasta}
echo "iqtree -s $i -pre $id -bb 1000 -nt 3" >> iqtree_command
done
$ cat iqtree_command | parallel --no-notice -j 20

在这种情况下,linux 就会同时运行 20 个命令并且每当一个命令结束时就直接换下一个命令,其中每个命令都使用 3 个线程执行。

也可以使用 ::: 传入文件进行并行:

1
$ parallel -j 20 'echo {}' ::: *.txt

上述命令在文件过多时可能会发生 Argument list too long 报错,此时也可以使用 find 传入:

1
$ find ./ -name "*.txt" -type f | parallel -j 12 'echo {}'

小命令项

kill 杀死进程

命令:kill %n kill -9 PID

其中 kill %n 是终止某个正在运行或被置于后台的进程,这些进程能够通过 job 命令找到。

kill -9 PID 则针对那些无法被 job 查询到的进程(例如在命令后面添加了 & 或者部分特殊的进程如 Java 等),相关进程的 PID 可以通过 tophtop 命令查询。

mv 改名

命令:mv 1.txt 2.txt

将 1.txt 重命名为 2.txt。

将某一目录下的文件名中某一字段替换为另一个字段:

1
2
3
4
$ for file in $(ls ./); do # 该示例中指定的为当前目录
newname=$(echo $file | sed 's/text1/text2/')
mv "$file" "$newname" # 若文件名不变则会返回信息
done

若要将子目录下的文件也进行该处理,则可以将 ls ./ 改为 find . -type f

grep 查找文件内容

命令:grep “123” n.txt 或者 cat n.txt | grep “123”

在 n.txt 中查找 123 的位置并输出所在行。

也可以在多个文件中进行查找,例如:grep "123" *.txt

less 浏览文件内容

命令:less 1.txt

浏览 1.txt 的内容,按住空格可以快速向下翻页,按住 u 可以快速向上翻页。

回车或下方向键显示下一行、按 y 或上方向键显示上一行。

sed 修改文件内容

命令:sed -i 's/string1/string2/g' filename

具体使用例子:

1
2
3
$ sed -i 's/@/_/g' filename
# 将 filename 中所有的 @ 替换成 _
# 关于 sed 的替换删除等具体指令格式及其正则用法可以查阅教程。

这个命令在大批量的文件内容处理替换方面有非常突出的效率。

比如:

1
$ sed -i 's/juse/Juse/g' *

可以将当前目录中所有文本类文件的 juse 替换成 Juse。同理可用于删除 Transdecoder 预测出的 pep 中的终止密码子 * (存在 * 时输入interproscan 会报错)。

locate 寻找文件

命令:locate xxx

出于某些原因,可能是文件放的太过杂乱,亦或是忘了自己在哪跑的命令,使用 locate 就能找到被遗失在某个角落的文件。

wget 下载 GEO 数据

命令:wget --content-disposition [link]

部分文件比如 GEO 上的数据等其直接提供的 http 链接是在重定向后才开始文件下载,如果直接使用 wget 只能下载到 html 文件。添加 --content-disposition 参数后可以解决这一问题。

杂项

去除当前目录下所有失效软链接

1
$ find . -type l -xtype l -delete
  • -type l 表示查找类型为软链接的文件。
  • -xtype l 表示额外检查链接类型,只选中那些指向不存在的目标的链接。
  • -delete 表示执行删除操作。

查看某个文件的行数

关键命令:cat wc 进阶应用(查看特定行):grep

1
2
3
4
5
6
1
2
3
4
5
6

以上述文件为例,可运行以下命令:

1
2
3
4
$ cat file.txt | wc -l
6
# 注意,这里会把空行给算进去,如果想不统计空行可用:
$ cat file.txt | grep -v "^$" | wc -l

具体的应用场景:

1
2
$ cat xxx.fasta | grep ">" | wc -l  # 统计组装的 contig 数量
114514

去除文件中的重复行

关键命令:cat sort uniq

例子:

1
$ cat xxx.txt | sort | uniq > xxx.txt

简单来说,就是把这个文件里的行给排列以后,再通过 uniq 去除重复行。

取出 a 文件中 b 文件不存在的行

关键命令:grep

假设 b 文件中所有行都为 a 文件中已有行,想取出 a 文件中 b 文件不存在的行(类似于 a-b):

1
$ grep -vFxf b a > c

其中:

  • -v 表示只显示不匹配的行。
  • -F 将模式视为固定字符串。
  • -x 表示完整匹配整行。
  • -f b 表示从文件 b 中读取行。

将正在运行的命令放置在后台

关键命令:bg

首先 ctrl+z 把命令放入后台,但此时命令会处于暂停状态。

此后输入 bg 可以使得它继续执行(如果要对特定命令可以先用 job 查看被中断的命令编号然后 bg %编号)。

此外,在命令的最后面加上 & 也能起到同样的作用。

中断命令

关键命令:kill

使用 job 可以看到不同工作的编号,然后把要 cut 的命令用 kill %编号 杀死。

但一般像这种会把已有的工作给断掉的命令都要谨慎使用

提高进程可以打开的最大文件数

关键命令:ulimit -S -s unlimited

在遇到因操作文件过多而引起的迭代错误等报错时,可以通过该命令解决。

随机复制一定数量的文件

1
$ find dir1 -type f -print0 | shuf -n 50 -z | xargs -0 cp -t dir2

dir1 中随机挑选 50 个文件并复制到 dir2 中。

终焉的禁忌之术 —— sudo rm -rf /

业界俗称删库跑路。记住,在任何情况下都应当小心地使用 rm -rf ,linux 没有回收站,也没有备份。

所有的文件在删除前都需小心思考再思考!就算跑出来的文件是错的或者是未符合预期的,都应当好好地评判是否有很大的必要将其马上删除,在大多数时候,所剩的空间可能足够让你暂时保留这些文件并且思考这些文件是否可用。当你发现或许还用的上这个文件但它已经被删除时,所带来的麻烦将比输入 rm -rf 大得多。

其他注意事项

  • 如果某个环境是专门为某个软件的运行配置好的,那么在不需要运行该软件时尽量不要使用这个环境,如果使用的话就尽量不要进行任何会变动相关依赖项版本的行为,避免后续报错或程序版本控制不一致。
  • 保持良好的编程习惯,划分好各个项目区域并且记录好所使用的关键命令。