顯示具有 regex 標籤的文章。 顯示所有文章
顯示具有 regex 標籤的文章。 顯示所有文章

2018年11月13日 星期二

含有正序全部5個母音的英文單字

英文全部5個母音是 a, e, i, o, u,要找到這些母音依序出現的英文單字:
  • cat /usr/share/dict/words | \
    grep -E "[aA]+[^aeiouAEIOU]*[eE]+[^aeiouAEIOU]*[iI]+[^aeiouAEIOU]*[oO]+[^aeiouAEIOU]*[uU]+" | \
    xargs -n4 -d'\n'
這邊用到兩個操作子:
  • ^:代表否定
  • *:代表存在0個到多個字母

在這個資料庫裡面總共有54個,每4個一行列出來如下:

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

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月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_

2017年6月29日 星期四

Ubuntu 16.04僅更新安全性套件

Ubuntu登入時,都會通知是否有套件需要更新、其中有幾個屬於安全性更新。若想要知道究竟哪些套件屬於安全性更新,下指令:
  • apt-get -s dist-upgrade |grep "^Inst" |grep -i security 
若要安裝這些安全性更新套件,則是以root的身份下指令:
  • apt-get -s dist-upgrade | grep "^Inst" | grep -i security | awk -F " " {'print $2'} | xargs apt-get --yes install

2016年8月30日 星期二

看執行程式的預設路徑(PATH)

在類UNIX系統裡面,想要看預設哪些資料夾下的指令可以直接跑,輸入
  • echo $PATH
  • echo $PATH | tr ':' '\n'
兩者出來的結果是一樣的,只是下面行指令比較好讀。若要知道某個指令現在是哪個路徑來的,則是使用which或是type這個指令:
  • which python
  • ls -l `which python`
  • type python
_EOF_

2016年8月1日 星期一

計算網頁被某個IP瀏覽過的次數

最近某個寫的網頁似乎被用程式不斷的query,造成系統資源吃太多。去/var/log/apache2裡面檢查 error.log 與 access.log 與 other_vhosts_access.log,看究竟是從哪些IP來連的。下面以 other_vhosts_access.log 為例子:
  • cat other_vhosts_access.log | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" | sort | uniq -c | sort -n
  • zcat other_vhosts_access.log.*.gz | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" | sort | uniq -c | sort -n

2016年6月20日 星期一

用find找檔案

在類UNIX系統(像Linux, Mac, BSD...)下面找檔案的指令叫做find。使用find,可以根據下面幾個檔案的特徵來搜尋:
  • 名稱:不一定要全名,可以是某個pattern
  • 型態:例如「檔案」、「目錄」、「連結」等等
  • 大小:大於或小於多少MB的檔案
  • 時間:檔案建立的時間、修改的時間
  • 擁有者:檔案由哪些人擁有

2016年6月9日 星期四

開始使用vi與vim

使用UNIX-like系統,一定會用指令列;使用指令列,一定會需要編輯文字。vi(visual editor)就是最常被使用的一種文字編輯器,vim(vi improved)則是vi的改良版。下面的指令意思是使用vim編輯一個叫做parody的文件:
  • vim parody

2016年4月27日 星期三

子程序使用的系統資源

前面提到程式可以產生很多子程序,這邊則是說明如何監控這些子程序,進而看要不要刪除這些死掉的程序。

首先執行《Bash的影分身術:Fork》裡面的fork.sh,下面第一個指令是看fork.sh與其產生的子程序的process IDs,第二個指令則是用top看前面20個子程序吃掉的系統資源
$ pgrep fork.sh
top -p `pgrep fork.sh | head -n 20 | tr "\\n" "," | sed 's/,$//'`
  • top -p:透過process IDs來監控使用資源
  • pgrep fork.sh:抓出fork.sh的PID與其子程式的PID
  • head -n 20:只取前面20行的PIDs,也可以用 tail -n 20 取後面20行
  • tr "\\n" "," :把很多行變成一行,中間用逗點區隔
  • sed 's/,$//'`:把一行中結尾的逗點去除

若想要刪除子程序,可以用下面兩個方式:
  • kill `pgrep fork.sh`
  • kill `pgrep -P fork.sh的PID`
第一種會刪除所有名字有fork.sh的程序(母程序與子程序都會刪除,名字一樣也會刪除);第二種則只有刪除子程序,但第二種必須要在母程序還沒有被終止前才有用

_EOF_