linux三劍客awk、grep、sed應用環境即常用命令
linux常用命令鏈接
https://man.linuxde.net/dos2unix
文本處理
-
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的行
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
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.pydos2unix -o test.py
直接修改原始文件格式為unixdos2unix 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!"
磁盤空間查看
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/
- 獲取遠程目錄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