顯示具有 sed與awk 標籤的文章。 顯示所有文章
顯示具有 sed與awk 標籤的文章。 顯示所有文章

2025年3月15日 星期六

用inxi指令列出網卡資訊,每兩行空一行

 一般的現代Linux,看網卡的使用的指令如下:

ip link
ip a
ip a show cx2
sudo ethtool cx2

依序列出所有網孔,所有網孔與對應的IP/MAC address、只顯示cx2這個網孔,cx2這網孔的進階資訊。但如果有安裝inxi這個指令的話,可以清楚的呈現網卡資訊,指令如下:

2023年11月2日 星期四

Bash一行文:文本第一行不參與sort排序

在處理文本資料,尤其是像csv格式的表格,第一列通常是表格每個欄位的標題(header),在排序的時候通常不會處理,但又會需要印出來看。例如說:

  1. df -Th
  2. df -Th | awk 'NR<2{print $0;next}{print $0| "sort"}'
  3. df -Th | { sed -u 1q; sort; }
  4. df -Th | (sed -u 1q; sort)

第1個指令是印出目前系統上的掛載點與使用空間,2, 3, 4三個指令結果一樣,都是將掛載點依照名稱排序,但第一行的欄位不參與排序。每個指令的詳細說明如下:

2022年9月2日 星期五

Awk抓檔案首行與偶數行

對一個檔案只要抓第一行與偶數行,用awk即可:

  • awk '{if (NR==1) {print $0} else if (NR % 2==0) {print $0}}' input.txt >output.txt

可以使用下面的測試,這樣就不需要input.txt這個檔案了:

  1. for i in {1..20};do echo $i; done | awk '{if (NR==1) {print $0} else if (NR % 2==0) {print $0}}'
  2. cat /etc/hosts | awk '{if (NR==1) {print NR" "$0} else if (NR % 2==0) {print NR" "$0}}'

這兩個指令的意思分別是

2021年1月11日 星期一

Ubuntu 20.04僅更新安全性套件

Ubuntu server版本登入的時候預設會提醒有哪些安全性套件要更新。也可以用下面的指令來看:

  • apt-get -s dist-upgrade | grep "^Inst" | grep -i security 

確定要安裝這些安全性套件security update,則是用下面指令:

  • apt-get -s dist-upgrade | grep "^Inst" | grep -i security | awk -F " " {'print $2'} | sudo xargs apt-get --yes install


2019年12月10日 星期二

awk不要分析csv檔案的第一行

許多csv (comma-separated values) 檔案的第一列會是欄位名稱,通常使用awk會不需要分析,解決方式如下:
  • awk -F',' -v OFS=',' '{if (NR==1) {next} else {print $0}}' input.csv > output.csv

上述的指令說明如下:

2019年11月19日 星期二

Shell一行文:每行前面加特定字串

對一個文字檔,每一行前面都要加個字串"Start_",用sed指令:
  • sed -i -e 's/^/Start_/' file
若不想要改到這個檔案,要存成另外一個新的則用:
  • sed -e 's/^/Start_/' file > file.new

2019年11月18日 星期一

Shell一行文:移除空白行

要移除檔案裡面的空白行只要用sed指令:
  • sed '/^$/d' /tmp/data.txt
若沒有更動原本的檔案,可以用IO轉向
  • sed '/^$/d' /tmp/data.txt > /tmp/output.txt

2019年8月30日 星期五

Shell一行文:FASTA核酸序列轉成大寫

要把FASTSA序列檔案通通轉成大寫,最直接的方式用tr指令:
  • cat DEMO.fasta | tr '[:lower:]' '[:upper:]'
但這樣會把開頭是>的註解行也通通轉成大寫,要避免此狀況用下面指令:
  • cat DEMO.fasta | sed '/^[^>]/ y/atcg/ATCG/'

2019年5月21日 星期二

awk篩選科學記號的欄位

awk可以根據資料裡面某欄位的數值大小來做篩選,但要注意要數值若是用科學記號的話,要小心不要讓awk把數值當成字串來處理。這篇文章比較下面四個指令:
  1. awk '$2 < "1E-10" {print}' input_file
  2. awk '$2 < 1E-10 {print}' input_file
  3. awk '($2+0) < 1E-10 {print}' input_file
  4. awk '($2+0) < 1E-10 && $2 != "NA" {print}' input_file
輸入的檔案請看文章後半部,這邊先說明指令的差別:

2018年12月5日 星期三

Shell一行文:文本每行的字元數

某個fasta檔案seq.fa,想要知道每一行出現的字元數:
  • cat seq.fa | awk '{print length;}'

2018年11月12日 星期一

含有五個母音最短與最長的英文單字

英文字母裡面含有五個母音且最短最長的單字,用下面的指令:
  • cat /usr/share/dict/words | \
    grep -ivE '^([^a]*|[^e]*|[^i]*|[^o]*|[^u]*)$' | \
    awk '{print length " " $0}' | \
    sort -n | head -n 20
  • cat /usr/share/dict/words | \
    grep -ivE '^([^a]*|[^e]*|[^i]*|[^o]*|[^u]*)$' | \
    awk '{print length " " $0}' | \
    sort -n | tail -n 20

2018年6月19日 星期二

用awk根據pattern擷取文字檔案片段

一個文字檔案textFile,想要看從start pattern開始到最後的一行:
  • awk '/start pattern/,0'
上面的/start pattern/,0是個範圍描述,代表說從看到start pattern開始,結束也要是為真的描述,但因為0永遠都不會為真,所以會印到最後一行。因此,如果是要看從start pattern到stop pattern之間的內容,那麼指令如下:
  • awk '/start pattern/,/stop pattern/'

2018年3月26日 星期一

sed直接編輯文件,做文字取代

sed可以直接編輯文件,取代或是修改特定pattern。例如說《各種恐懼》放到phobia.txt這個檔案中,內容如下:
homophobia
hydrophobia
phobia
xenophobia

這時候要把這個文件的phobia通通改成phobe
  1. sed -i -e 's/phobia/phobe/' phobia.txt
  2. sed -i -e 's/phobia/phobe/g' phobia.txt
  3. sed -i .bak -e 's/phobia/phobe/g' phobia.txt
注意-i代表Edit file in-place,也就是直接編輯檔案的意思

2017年8月9日 星期三

讓sort用多核心跑

GNU sort(就是在Linux裡面預設的,作者是Mike Haertel與Paul Eggert),裡面有個平行化的選項,如果不選的話預設就會開多核心。這邊測試《PDB中最常出現的氨基酸片段》裡面排序進一億筆5-mer,得到的速度與用單核心來比較



2017年8月6日 星期日

PDB中最常出現的氨基酸片段

想要知道五個連續氨基酸出現次數用下面兩個指令就可以得到:
  1. wget ftp://ftp.wwpdb.org/pub/pdb/derived_data/pdb_seqres.txt
  2. cat pdb_seqres.txt | grep -e "mol:protein" -A 1 \
    | sed '/^--$/d' | grep -v "^>" \
    | awk '{while(length($0)>=5){print substr($0,1,5);gsub(/^./,"")}}' \
    | grep X -v | sort | uniq -c | sort -k 1 -n -r \
    > prot_sorted_5peptide.count
第1個指令是下載當前所有PDB檔案序列pdb_seqres.txt,約122MB
第2個指令是計算個數的檔案,結果存在prot_sorted_5peptide.count裡面,計算的時間約莫是五分鐘,下面是分析的指令:

2017年7月30日 星期日

用cat指令產生一個文字檔案

在終端機內想要產生一個檔案卻又不想要運任何的文字編輯器,可以只用cat配合上IO redirection,例如說:
  • cat > txt << _END_
  • ABCDEFGHI
  • IJKLMNOP
  • QRSTUVWX
  • _END_
以上每打完一行就要按Enter,如果在某一行內打錯字是可以用backspace的,最後的_END_代表的看到某一行是_END_時候,這個檔案就編輯完成可以寫入一個名叫做txt的文件。內容就會是上面指令藍色的部分:
  • cat txt
    ABCDEFGHI
    IJKLMNOP
    QRSTUVWX

2017年7月3日 星期一

大量搬移帳號

在Linux上面想要將A機器上面的帳號搬移到B機器上面,又不想要改密碼,可以藉由修改 /etc/passwd/etc/shadow 兩個檔案來完成。

首先,用下面的指令根據UID來排序A機器上面的帳號
  • sort -n -t ':' -k3 /etc/passwd
假設要移動的使用者帳號的UID從1111到2222,首先用下面的指令來看B機器上面有沒有UID從1111到2222的使用者
  • sort -n -t ':' -k3 /etc/passwd | awk -F ":" '$3>=1111 {print}' | awk -F ":" '$3<=2222 {print}'
確定B機器沒有上述帳號以後,才能安心地把帳號從A機器搬到B機器。這時候要在A機器上面把這些帳號印出來:
  1. sort -n -t ':' -k3 /etc/passwd | awk -F ":" '$3>=1111 {print}' | awk -F ":" '$3<=2222 {print $1}'
  2. sort -n -t ':' -k3 /etc/passwd | awk -F ":" '$3>=1111 {print}' | awk -F ":" '$3<=2222 {print $1}' | tr '\n' '|' | sed s'/.|$/\n/'
上面第1個指令是僅僅印出來帳號名稱、一行一個帳號,第二個指令則是變成egrep可以讀的pattern,這樣才能夠用下面的egrep指令將A機器裡面的 /etc/shadow 裡面的資料給抓出來:
  • sudo egrep -E `sort -n -t ':' -k3 /etc/passwd | awk -F ":" '$3>=1111 {print}' | awk -F ":" '$3<=2222 {print $1}' | tr '\n' '|' | sed s'/.|$/\n/'` /etc/shadow
最後把上述指令印出來的帳號相關資訊附加到到B機器的/etc/shadow檔案後面,這樣就完成從A機器大量搬移帳號到B機器,而且還不需要改密碼~

參考資料

_EOF_