實用的bash指令碼 ping區域網路中所有的機器 for i in `seq 1 254`;do (ping 192.168.0.$i &);sleep 0.1;killall ping;done for i in `seq 1 10`;do ping 10.228.151.$i -c1;done|grep ttl批量在用戶端添加hosts對應關係 #!/bin/bash for ((i=2; i<=100; i++)) do _ip=10.11.45.$i ssh $_ip "echo \"${_ip} \"\$(hostname) >> /etc/hosts" done 用戶端命令執行工具 vim batch_run.sh #!/bin/bash # wangyang usage () { echo "Usage $0 list_file \"command\"" exit 1 } if [[ $# != 2 ]]; then usage fi _file=$1 _command=$2 if [ ! -f $_file ]; then echo "ERR can't find list file $_file" exit 2 fi for _ip in $(cat $_file|grep -v "^#") do echo $_ip ssh $_ip "$_command" echo done vim hosts.txt 192.168.0.2 192.168.0.3 192.168.0.4 例子: #batch_run.sh hosts.txt "cat /etc/hosts" 檔案分髮腳本 vim batch_cp.sh #!/bin/bash usage () { echo "Usage $0 list_file local_file remote_path" exit 1 } if [[ $# != 3 ]]; then usage fi _file=$1 _lf=$2 _rp=$3 if [ ! -f $_file ]; then echo "ERR can't find list file $_file" exit 2 fi for _ip in $(cat $_file|grep -v "^#") do echo $_ip scp -r $_lf $_ip:$_rp echo done vim hosts.txt 192.168.0.2 192.168.0.3 192.168.0.4 例子: #./batch_cp.sh hosts.txt /tmp/aaa /root/ 刪除文本中得重複行 在進行文本處理的時候,我們經常遇到要重複資料刪除行的情況。那怎麼解決呢?下面就是三種常見方法?第一,用sort+uniq,注意,單純uniq是不行的。 shell> sort file | uniq 這裡我做了個簡單的測試,當file中的重複行不再一起的時候,uniq將服務刪除所有的重複行。經過排序後,所有相同的行都在相鄰,因此unqi可以正常重複資料刪除行。第二,用sort+awk命令,注意,單純awk同樣不行,原因同上。 shell> sort file | awk '{if ($0!=line) print;line=$0}' awk '!a[$0]++' fetion_info.txt 當然,自己把管道後面的代碼重新設計一下,可能不需要sort命令先排序拉。第三,用sort+sed命令,同樣需要sort命令先排序。 shell> sort file | sed '$!N; /^(.*)n1$/!P; D'最後附一個必須先用sort排序的文本的例子,當然,這個需要用sort排序的原因是很簡單,就是後面演算法設計的時候的“局部性,相同的行可能分散出現在不同的地區,一旦有新的相同行出現,那麼前面的已經出現的記錄就被覆蓋了 comm --取兩個檔案的差集合并集 今天需要取兩個檔案的並集,自己寫指令碼處理太麻煩,一查,果然有現成的工具,comm。需要注意的事,使用comm之前,兩個檔案都是必須是sort好了的。 In our work, we often encounter the following questions:在我們的工作中,我經常遇到下面的問題:I have two files: file1 and file2:有兩個檔案:檔案1和檔案2:1) How can I print out the lines that are only contained in file1?1) 如何列印出只存在於檔案1中的內容?2) How can I print out the lines that are only contained in file2?2) 如何列印出只存在於檔案2中的內容?3) How can I print out the lines that are contained both in file1 and file2?3) 如何列印出檔案1和檔案2都有的內容? There is a powerful shell command that can easily meet our needs, it is: comm. 這有一個很好的shell命令能夠滿足我們的需求,它就是comm。 When you meet the above questions, "comm" should be your first choice:-)當你遇到上面的問題,“comm”應該是你第一選擇:-) comm [ -123 ]??file1??file2 comm will read file1 and file2 and generate three columns of output: comm 將會讀取檔案1和檔案2並且產生三列輸出:lines only in file1; lines only??in file2; and lines in both files. 只存在檔案1中的行;只存在檔案2中的行;兩個檔案都存在的行。For detailed explanation, pls man comm.更詳細的解釋,請參閱man comm。 Example:例如: bash-2.03$ cat file1111111112222222233333333444444445555555566666666777777778888888899999999bash-2.03$ cat file20000000022222222444444446666666688888888 1) suppress lines unique to FILE11) 過濾掉file1中的內容bash-2.03$ comm -1 file1 file2 00000000 22222222 44444444 66666666 88888888 2) suppress lines unique to FILE22) 過濾掉file2中的內容bash-2.03$ comm -2 file1 file2 11111111 2222222233333333 4444444455555555 6666666677777777 8888888899999999 3) suppress lines that appear in both files3) 過濾掉file1和file2中都有的內容bash-2.03$ comm -3 file1 file2 000000001111111133333333555555557777777799999999 4) Print out the lines that are only contained in file1?4) 列印出只存在於檔案1中的內容?bash-2.03$ comm -23 file1 file21111111133333333555555557777777799999999 5) Print out the lines that are only contained in file2?5) 列印出只存在於檔案2中的內容?bash-2.03$ comm -13 file1 file200000000 6) Print out the lines that are contained both in file1 and file2?6) 列印出檔案1和檔案2都有的內容?bash-2.03$ comm -12 file1 file222222222444444446666666688888888 Besides the comm, we still have various ways to finish the above tasks.除了comm,我們還有其他方法來完成這些任務。 4) Print out the lines that are only contained in file1?4) 列印出只存在於檔案1中的內容?diff file1 file2 | grep "^<"|sed 's/^< //g'for i in $(>temp ; done;cat temp