跳转至

linux三剑客awk、grep、sed应用环境即常用命令

linux常用命令链接

https://man.linuxde.net/dos2unix

https://man.linuxde.net/命令

https://man.linuxde.net/awk

文本处理

cat name.txt|awk '{print $1,$NR,$0}' 读取name.txt 输出第一列$1,最后一列$NR,和整行$0

分列输出文件无需循环,分列精品。

awk -F , 'NR!=1{print $2 >$1".txt"}' geneinfo.csv 指定 ,为分隔符,逐行输出第二列的内容到对应的第1列的 文件名的txt文件。

awk使用shell中的变量

awk中的变量不需要使用$符号。使用$符号则表示的是第n列。

num=100
awk -v num=$num 'BEGIN{print num/0.5}'

awk向shell中传递变量

eval $(awk 'BEGIN{print "var1='str1';var2='str2'"}')
#           $()等价于``
eval `awk 'BEGIN{print "var1='str1';var2='str2'"}'`

awk 获取指定列(此处是第三列到最后一列)分隔符为一个空格

awk -F " " '{for(i=3;i<=NF;i++) {printf $i" "} printf "\n"}' file

awk获取指定列(此处是第三列到最后一列)分割符为tab

awk '{$1="";$2="";print $0}' file |sed 's/\t\t//g'

cat name| grep zhan 查找name文件里含有zhan的行 grep -v "node" filename 查找filename里不包含node的行

sed -n '1,10p' name.txt 获取1-10行的内容 - cut cut -f 4-10 test.txt#获取text.txt的第4-10列。

cut参数说明

-b 表示字节; -c 表示字符; -f 表示定义字段。

指定分隔符号使用-d 符号 N-:从第N个字节、字符、字段到结尾; N-M:从第N个字节、字符、字段到第M个(包括M在内)字节、字符、字段; -M:从第1个字节、字符、字段到第M个(包括M在内)字节、字符、字段。 例: cut -f 5- -d "," test.csv 查看test.csv文件的第5列到最后一列,指定的分隔符号是, cut -c 1-4 test_Dsuite.txt 查看文件的第1到第4个字符。 - column column -t 文件按照table格式查看,配合head可以更加清楚的阅读文件的前几行。 column -t test_Dsuite.txt|head -5 查看tab分割文件的前5行,以table格式查看。

文件处理

find ./ -name "*.txt" 查找当前目录下所有的txt结尾的文件,包括子目录里的文件。

  • rename 批量重命名(此处的rename是perl版本的)

rename有C语言版本和perl版本,以下命令均是perl版本的命令。

使用命令man rename如果返回的窗口首行有perl`则是perl版本,否则即是C语言版本。

ubuntu安装perl版本的rename

shell sudo apt update sudo apt-get install rename

rename参数讲解: s表示使用正则, 第1-2个/之间是要匹配的内容,$表示文件结尾。第2个/之后是要替换成的内容,最后跟上要操作的文件 *表示所有文件。注意:perl中''""不等价,此处应该使用的是单引号''

  • 字符替换

    rename 's/AA/aa' *.fa 把所有.fa文件名中的AA替换成aa

  • 修改文件后缀

    rename 's/\.html/\.php' * 把.html文件改为.php文件

    rename 's//$/.txt' *把所有文件名末尾添加.txt

    rename 's/^/admin' * 所有文件开头添加字符admin

    rename 'y/A-Z/a-z/' * 修改文件名大写字符为小写

    rename 's/[]+//g' * 去掉文件名中的空格

    rename 's/\.bak$//' *.bak 所有的.bak后缀名的文件全部删除后缀名

  • 正则匹配修改文件名

    • rename 's/(/d)/第$1章/' * 修改为第1章,第2章

方法1:把文件名拆分处理,可以任意修改文件名

find -name '*.log' -printf %f//n|awk -F'.' '{print $1}'|xargs -i{} mv {}.log xiyun_{}.log

方法2:利用rename

一般的linux下的rename命令比较简单

rename 'test' 'xiyun' '*.log'

把文件名中的某部分字符串替换掉

ubuntu下的rename命令支持正则表达式,因此功能更强大。

方法3:直接利用find和xargs和mv,中间不用awk,这样只能添加后缀名,不能修改文件名。

  • ln 建立超链接

ln 远端文件 新文件 新文件即生成的远端文件的硬链接

ln -s /disk/readme ./read 生成软链接,实际是在当前目录生成名为read的超链接,链接到disk/readme ,访问read,即相当于访问readme

  • dos2unix 转换windows文件为Unix格式

dos2unix test.py把test.py转换成Unix格式

dos2unix -n test.py u-test.py把test.py转换成unix的新文件u-test.py

dos2unix -o test.py直接修改原始文件格式为unix

dos2unix file1 file2 file3 同时修改多个文件的格式为unix

  • unix2dos 转换Unix格式为windows

unix和windows 的文件格式中换行符的格式不一致,一定要注意转换换行符。否则会报错。

unix和windows的文件系统也不一致,windows的Fat32(不支持单个文件大于4G),NTFS(目前常用的文件系统格式),linux是Ext2格式。如果要在两种系统格式之间传输文件,NTFS的硬盘在linux上不会被识别,最后使用第三方软件识别。

  • md5sum MD5值生成核对

md5sum test生成test文件的md5值。

md5sum -c testsum test 核对test的文件和testsum文件中的MD5值是否一致。

  • 排序参考 sort test.txt排序 sort命令的字段 -n按照数字进行排序 -d 按照字典顺序排序 -r 逆序排序 -k N指定按第N列排序 sort -nrk 1 data.txt sort -bd data//忽略空格之类的前导空白符 sort info.csv|uniq 反向排序 sort test.txt | uniq消除重复行 sort test.txt | uniq -c 统计重复行出现的次数 sort test.txt | uniq -d找出重复行 指定每行中需要比较的重复内容 -s 开始位置 -w 比较字符数
  • 进程管理(杀死进程参考) ps 查看后台进程(仅限当前终端用户的后台进程) image.png ps命令输出的第一列即为PID. ps -ef查看所有用户进程 kill -s 9 3645522 杀掉PID为3645522的进程,此处是杀掉md5sum的进程。 pkill -9 md5sum 强力删除程序名为md5sum的进程。
kill -s 9 `pgrep vim `  #使用pgrep和kill来删除名字为vim的进程。

-进程检测 ps -x |grep fastp|grep -v "grep"|wc -l 统计当前用户的所有运行进程中,名字为fastp的进程数量

  • 文件名字符的处理 cut参考 expr参考 name是一个文件夹,里面有zao_L2_384384.R1.fastq.gz之类文本。 cut -f1 -d "." name 指定分割符号.分割,获取第一列的字符 cut -f1 -d "." --complement name 指定分割符号.分割,删除第1列后的字符 expr substr zao_L2_384384.R1.fastq.gz 1 3 获取字符串的指定字符,第1-3个字符。 -xargs ls *.gz|grep F2-3|xargs -i mv {} ./F2-3/查找当前目录中所有的gz文件,从中找到含有F2-3的,全部移动到当前目录中F2-3文件夹中。

#### 进程监控脚本

#!/bin/bash
line=`ps x|grep processname|grep -v "grep"|wc -l`
while [ $line -gt 0 ]
do
    echo "no~"
    sleep 30
    line=`ps aux|grep processname|grep -v "grep"|wc -l`
done
echo "yes!"

image.png

磁盘空间查看

df -lh 查看整个服务器的磁盘分区使用情况 du -lh 查看当前目录的磁盘使用情况

查看服务器运行状态

top 所有信息 top -u username 指定用户的运行信息 ps -ef所有进程信息 ps -x 当前用户的进程

文件查看工具

head filename 查看前几行, - head -10 readme 查看readme文件的前10行 tail filename - tail -8 errinfo 查看errinfo文件的后8行 more filename 滚动方式查看文件,空格或enter键,往下继续阅读。不能上翻 less filename 滚动方式查看文件,pgdn向下翻页,pgup向上翻页。 vim readme 使用vim编辑readme文件。

文件传输

常用的文件传输类型有:win-linux和linux-linux mac没用过不清楚。 - windows传输到linux,我一般使用 winSCP这个软件下载地址。各大软件商店都有这款软件。 - linux到linux传输,使用命令scp.参考文章 例如有如下两个主机:172.28.218.254(本地)172.28.210.9(远程) 传输文件 在本地主机(172.28.218.254)运行如下命令: 说明:chaim是我在远程主机上的用户名 + 获取远程目录maize scp -r chaim@172.28.210.9:/disk/maize/ ./maize/ /disk/maize/ 这是远端服务器的文件地址 ./maize/这是存储到本地服务器的地址 + 获取远程文件readme scp chaim@172.28.210.9:/home/info/readme ./Readme
+将本地文件上传到远程 scp /public/disk.info chaim@172.28.210.9:/home/info/disk.info +将本地文件夹上传到远程 scp -r /public/maize/ chaim@172.28.210.9:/disks/backup/maize/ + 指定端口2235传输本地bam到远程主机172.28.210.9 scp -P 2235 sam1.bam chaim@172.28.210.9:/disks/backup/maize/

在经历了scp传输中断,多个大文件需要重新传输的痛苦后,决定使用支持断点续传的rsync

rsync 传输时,在另一端主机上会生成临时的隐藏文件,通过ls -la可以查看到。等待传输完成或中断时会显示出正常的文件名。 上传数据到远程服务器 rsync -P --rsh=ssh readme.md tang@172.28.218.254:~/chaim/

指定端口2222,传输bam文件到远程主机21.28.170.146

rsync -P -e 'ssh -p 2222' sample.bam chaim@21.28.170.146:/share/home/bam

回到页面顶部