<a href="https://s4.51cto.com/wyfs02/M01/A7/3B/wKioL1nkGTuB8NUPAAr1vIrzw7A209.png" target="_blank"></a>
awk比sed、grep要複雜一些,awk支援分段,例如像passwd檔案的内容很有規律用冒号分成七段,awk可以針對每一段進行比對。
awk最簡單的用法就是照某個字元進行分割,然後可以選擇列印某一段:
<a href="https://s2.51cto.com/wyfs02/M01/08/8C/wKiom1nkG_OT9-esAAPeHwQcsq4138.png" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M02/A7/3B/wKioL1nkGULCE055AAn4jdnXem8196.png" target="_blank"></a>
列印所有的段:
<a href="https://s4.51cto.com/wyfs02/M01/08/8C/wKiom1nkG_yRakuyAAmXKEdcpDE614.png" target="_blank"></a>
不分段,直接列印檔案内容:
<a href="https://s1.51cto.com/wyfs02/M00/A7/3B/wKioL1nkGUqzqFpyAAgQ1K0EvxA318.png" target="_blank"></a>
不指定分段的字元符就會預設以空格為分段字元:
<a href="https://s1.51cto.com/wyfs02/M02/08/8C/wKiom1nkHALRx1v7AAZEVG50kEQ407.png" target="_blank"></a>
列印多段内容:
<a href="https://s3.51cto.com/wyfs02/M00/A7/3B/wKioL1nkGVGhJ72hAAj3VGAUQYQ904.png" target="_blank"></a>
指定列印的時候以什麼字元進行分割,例如我以*号進行分割:
<a href="https://s3.51cto.com/wyfs02/M02/A7/3B/wKioL1nkGZXzq8YhAAv_BEubk3k942.png" target="_blank"></a>
比對指定字所在的行:
<a href="https://s3.51cto.com/wyfs02/M00/08/8C/wKiom1nkHEuBiOQSAALyCUZtloU807.png" target="_blank"></a>
指定比對某一段并且此段包含指定字元的行,例如我指定比對第一段包含有oo字元串的行:
<a href="https://s3.51cto.com/wyfs02/M01/08/8C/wKiom1nkHEvD6iFvAAF34LhnBXE862.png" target="_blank"></a>
這就是awk強大的地方,并且同樣比對正規表達式。
在awk中使用正規表達式不用加脫義符,預設就可以支援:
<a href="https://s1.51cto.com/wyfs02/M02/A7/3C/wKioL1nkGZai56rkAAGq40IgG9s170.png" target="_blank"></a>
awk支援同時寫多個表達式:
<a href="https://s1.51cto.com/wyfs02/M00/A7/3C/wKioL1nkGZfjlI0jAAK--TYHc7w304.png" target="_blank"></a>
這個指令表示列印含有root或user字元的行
使用|也可以:
<a href="https://s4.51cto.com/wyfs02/M01/08/8C/wKiom1nkHE6h9BLIAAJfjQmkIpI496.png" target="_blank"></a>
awk還可以使用關系運算符:
<a href="https://s4.51cto.com/wyfs02/M02/08/8C/wKiom1nkHE6SSQdNAAIppE4P9oQ958.png" target="_blank"></a>
這個指令表示比對第三段含有0的行
<a href="https://s5.51cto.com/wyfs02/M00/08/8C/wKiom1nkHUKSQX1pAANxVfwh8bk129.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M02/A7/3C/wKioL1nkGqCCPgCcAANj0dR-XWw553.png" target="_blank"></a>
以上使用關系運算符進行的比對是按照實際數字大小來比對的,如果要按ASCII碼的的大小比對的話,加上雙引号即可:
<a href="https://s4.51cto.com/wyfs02/M01/08/8C/wKiom1nkHVrTxkX_AAibmbvSLco584.png" target="_blank"></a>
<a href="https://s4.51cto.com/wyfs02/M00/A7/3C/wKioL1nkGqWgz-hEAAMNEyeeBSw610.png" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M02/08/8C/wKiom1nkHWDRTmc7AAoH8kLhCEY092.png" target="_blank"></a>
在awk指令裡使用比較運算符:
<a href="https://s2.51cto.com/wyfs02/M01/A7/3C/wKioL1nkGqyQQB2_AAP7rn4jACI091.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M01/A7/3C/wKioL1nkGq3gxWPpAAJb-kd6r5U523.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M00/A7/3C/wKioL1nkGvnwOUlMAAJFkq5UJsA093.png" target="_blank"></a>
指定列印的分割符:
<a href="https://s3.51cto.com/wyfs02/M01/A7/3C/wKioL1nkGvqSq6MGAAMEZcGt7xc219.png" target="_blank"></a>
想要寫得規整一些就加上if條件判斷語句:
<a href="https://s3.51cto.com/wyfs02/M00/08/8C/wKiom1nkHbGAKWzjAANJyl_tLDA414.png" target="_blank"></a>
使用内置變量列印所有的行:
<a href="https://s3.51cto.com/wyfs02/M02/A7/3C/wKioL1nkGv-i0BKGAAj7BeCqygk952.png" target="_blank"></a>
NR表示行
<a href="https://s1.51cto.com/wyfs02/M01/08/8C/wKiom1nkHbmwxHasAAgziWZG0Zc566.png" target="_blank"></a>
NF表示段
NR可以作為一個判斷條件,例如我隻列印前10行:
<a href="https://s2.51cto.com/wyfs02/M00/A7/3C/wKioL1nkGwazXECJAAUN7rq3ziM038.png" target="_blank"></a>
使用多個判斷條件:
<a href="https://s3.51cto.com/wyfs02/M02/08/8C/wKiom1nkHbyyMjrFAAJoQpjo-l4389.png" target="_blank"></a>
給NR和NF加上$符:
<a href="https://s4.51cto.com/wyfs02/M01/08/8C/wKiom1nkHkaCPEYbAAxVxzUutxs240.png" target="_blank"></a>
使用awk指令對檔案的某一段進行指派:
<a href="https://s2.51cto.com/wyfs02/M00/A7/3C/wKioL1nkG5GBHMOBAAMEZQb3-Gw599.png" target="_blank"></a>
使用awk指令進行求和:
<a href="https://s2.51cto.com/wyfs02/M00/A7/3C/wKioL1nkG5KAgBnBAAJOO6sIe14541.png" target="_blank"></a>
本文轉自 ZeroOne01 51CTO部落格,原文連結:http://blog.51cto.com/zero01/1972703,如需轉載請自行聯系原作者