1. 程式人生 > 實用技巧 >bash常見用法

bash常見用法

寫一個 bash指令碼以輸出一個文字檔案 nowcoder.txt中的行數
wc -l
經常檢視日誌的時候,會從檔案的末尾往前檢視,於是請你寫一個 bash指令碼以輸出一個文字檔案 nowcoder.txt中的最後5行
tail -5 nowcoder.txt
寫一個 bash指令碼以輸出數字 05007 的倍數(0 7 14 21...)的命令
for i in {0..500..7}
    do
        echo $i
    done
寫一個 bash指令碼以輸出一個文字檔案 nowcoder.txt 中第5行的內容。
awk '{if (NR == 5) print $0}
' nowcoder.txt

寫一個 bash指令碼以輸出一個文字檔案 nowcoder.txt中空行的行號,可能連續,從1開始
awk '{if ($0 == null) print NR}' nowcoder.txt

awk '/^$/  {print NR}' nowcoder.txt
寫一個 bash指令碼以去掉一個文字檔案 nowcoder.txt中的空行
awk '{if ($1.length >= 1) print $1}' nowcoder.txt

sed '/^$/d' nowcoder.txt

寫一個 bash指令碼以統計一個文字檔案 nowcoder.txt中字母數小於8的單詞。
awk '{for(i=1;i<=NF;i++) if (length($i) <8) print $i}' nowcoder.txt 其中NF表示的欄位數

假設 nowcoder.txt 內容如下:
root         2  0.0  0.0      0     0 ?        S    9月25   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<   9月25   0:00 [kworker/0:0H]
web       1638  1.8  1.8 6311352 612400 ?      Sl   10月16  21
:52 test web 1639 2.0 1.8 6311352 612401 ? Sl 10月16 21:52 test tangmiao-pc 5336 0.0 1.4 9100240 238544 ?? S 3:09下午 0:31.70 /Applications 以上內容是通過ps aux | grep -v 'RSS TTY' 命令輸出到nowcoder.txt檔案下面的 請你寫一個指令碼計算一下所有程序佔用記憶體大小的和: awk 'BEGIN{sum=0} {sum=sum+$6} END{print sum}' nowcoder.txt 其中$0 指的是一行資料,$1指的是一行資料中的第一個,依次往後, 其實該提計算的是虛擬記憶體所佔的頁的數量之和,並不是虛擬虛擬記憶體的大小; 第一列是程序名,2是pid, 3是cpu百分比,4是記憶體的百分比,5是虛擬記憶體,6是頁數量
寫一個 bash指令碼以統計一個文字檔案 nowcoder.txt 中每個單詞出現的個數。

為了簡單起見,你可以假設:
nowcoder.txt只包括小寫字母和空格。
每個單詞只由小寫字母組成。
單詞間由一個或多個空格字元分隔。

示例:
假設 nowcoder.txt 內容如下:
welcome nowcoder
welcome to nowcoder
nowcoder
你的指令碼應當輸出(以詞頻升序排列):
to 1 
welcome 2 
nowcoder 3

 cat nowcoder.txt| tr -s ' ' '\n' | sort | uniq -c | sort| awk '{print $2,$1}'

給定一個 nowcoder.txt檔案,其中有3列資訊,如下例項,編寫一個sheel指令碼來檢查檔案第二列是否有重複,且有幾個重複,並提取出重複的行的第二列資訊:
例項:
20201001 python 99
20201002 go 80
20201002 c++ 88
20201003 php 77
20201001 go 88
20201005 shell 89
20201006 java 70
20201008 c 100
20201007 java 88
20201006 go 97

結果:
2 java
3 go

awk '{print $2}' | sort | uniq -c | sort | grep -v '1'
寫一個 bash指令碼來轉置文字檔案nowcoder.txt中的檔案內容。

為了簡單起見,你可以假設:
你可以假設每行列數相同,並且每個欄位由空格分隔

示例:
假設 nowcoder.txt 內容如下:
job salary
c++ 13
java 14
php 12

你的指令碼應當輸出(以詞頻升序排列):
job c++ java php
salary 13 14 12

awk '{
    for (i=1;i<=NF;i++){
        if (NR==1){    
            res[i]=$i  
        }
        else{
            res[i]=res[i]" "$i   // 做追加處理
        }
    }
}END{
    for(j=1;j<=NF;j++){
        print res[j]  // 每個欄位是原始資料的一列
    }
}' nowcoder.txt

awk是對每一行資料做處理, END是結束上次for迴圈的每一行資料的處理;然後將處理的資料再輸出;
寫一個 bash指令碼以統計一個文字檔案 nowcoder.txt中每一行出現的1,2,3,4,5數字個數並且要計算一下整個文件中一共出現了幾個1,2,3,4,5數字數字總數。



示例:
假設 nowcoder.txt 內容如下:
a12b8
10ccc
2521abc
9asf
你的指令碼應當輸出:
line1 number: 2
line2 number: 1
line3 number: 4
line4 number: 0
sum is 7

awk '
{
    count=0
    len=length($0)
    for(i=1;i<=len;i++){
        s = substr($0,i,1)
        if(0<s && s<6){
            count++
            total++
        }
    }
     print "line"NR "number:"count
}END {
     print "sum is"total
}' nowcoder.txt

substr(a,b,c) a是字串, b是開始位置,c是多少個字元