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 查找文件
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' *
把所有文件名末尾添加.txtrename 's/^/admin' *
所有文件开头添加字符adminrename '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
查看后台进程(仅限当前终端用户的后台进程) 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个字符。 -xargsls *.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!"
磁盘空间查看
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