ubuntu 操作補充 查找文件 和 awk

1.whereis 文件名
  特點:快速,但是是模糊查找,例如 找 #whereis mysql 它會把mysql,mysql.ini,mysql.*所在的目錄都找出來.我一般的查找都用這條命令.
  2.find / -name 文件名
  特點:準確,但速度慢,消耗資源大,例如我想找到php.ini的準確位置,就需要用
  #find / -name php.ini
  3.locate 文件名
  強力推薦的方法,最快,最好的方法.

  注意:第一次使用該命令,可能需要更新數據庫,按照提示的命令執行一下就好了.


先試試在命令行這麼做:echo `cat list`
然後仔細看看腳本里面 `echo $line` 的結果

cat會輸出文件原本的樣子。

是echo自動會把tab轉換爲空格,echo "$line"這種寫法就避免了這種情況


uniq 命令

-c 在輸出行前面加上每行在輸入文件中出現的次數。
-d 僅顯示重複行。
-u 僅顯示不重複的行。

Linux系統中的wc(Word Count)命令的功能爲統計指定文件中的字節數、字數、行數,並將統計結果顯示輸出。
1.命令格式:
wc [選項]文件...
2.命令功能:
統計指定文件中的字節數、字數、行數,並將統計結果顯示輸出。該命令統計指定文件中的字節數、字數、行數。如果沒有給出文件名,則從標準輸入讀取。wc同時也給出所指定文件的總統計數。
3.命令參數:
-c 統計字節數。
-l 統計行數。
-m 統計字符數。這個標誌不能與 -c 標誌一起使用。
-w 統計字數。一個字被定義爲由空白、跳格或換行字符分隔的字符串。
-L 打印最長行的長度。
-help 顯示幫助信息
--version 顯示版本信息


計算器命令 :bc 

通過管道命令送入這個計算器程序就好了

或者echo$(expr  xxxxx)



Linux中常常會使用到cut命令來分割字符串,下面說明下cut命令參數的使用:
         -d  指定分隔符,如:按照“:”分割,-d:
         -c  提取第n個字節,如:-c5,表示提取每行的第5個字節,-c5-14,表示提取每行的第5-14個字節,-c1,5,14,表示提取第1、5、14個字節。
         -f  指定輸出的域
         實例:cut  –d:  -f1,2   //按照”:”來分割,並輸出第1和2段
[root@centos ~]# cat test.txt
1:2:3
a:b:c
[root@centos ~]# cut -d: -f1,2 test.txt
1:2
a:b



cat logt.log|sort -s -t '-' -k1n |awk '{print $1;}'|uniq -c|sort -k1 -nr|head -100
統計文件中出現次數最多的前10個單詞
使用linux命令或者shell實現:文件words存放英文單詞,格式爲每行一個英文單詞(單詞可以重複),統計這個文件中出現次數最多的前10個單詞。
cat words.txt | sort | uniq -c | sort -k1 -nr | head -10
  主要考察對sort、uniq命令的使用,相關解釋如下,命令及參數的詳細說明請自行通過man查看,簡單介紹下以上指令各部分的功能:
sort:  對單詞進行排序
uniq -c:  顯示唯一的行,並在每行行首加上本行在文件中出現的次數
sort -k1,1nr:  按照第一個字段,數值排序,且爲逆序
head -10:  取前10行數據


NF代表:瀏覽記錄的域的個數

$NF代表 :最後一個Field(列)


NF-3的意思是倒數第三個字段,ssh2是第-0個字段,663951是第-1個字段....
192.168.0.78是第-3個字段。

NF代表:瀏覽記錄的域的個數

$NF代表 :最後一個Field(列)


grep "Failed" /var/log/secure | awk '{print $(NF-0)}'

{print NF} 也有{print $NF}
前者是輸出了域個數,後者是輸出最後一個字段的內容
如:~# echo $PWD | awk -F/ '{print $NF}'



NR,表示awk開始執行程序後所讀取的數據行數.
FNR,與NR功用類似,不同的是awk每打開一個新文件,FNR便從0重新累計.
 
在看一個例子關於NR和FNR的典型應用:
#cat a
張三|000001
李四|000002
#cat b
000001|10
000001|20
000002|30
000002|15
 
想要得到的結果是將用戶名,帳號和金額在同一行打印出來,如下:
張三|000001|10
張三|000001|20
李四|000002|30
李四|000002|15
 
awk -F'|' 'NR==FNR{a[$2]=$0;next}{print a[$1] FS $2}' a b


awk -F'|' '{a[$2]=$0}NR>FNR{print a[$1] FS $2}' a b
[解析]
由NR=FNR成立,判斷當前讀入的是第一個文件a,然後使用{a[$2]=$0;next}循環將a文件的每行記錄都存入數組a,並使用$2作爲下標引用.next,不在執行後面的語句.
由NR=FNR不成立,判斷當前讀入了第二個文件b,然後跳過{a[$2]=$0;next},對第二個文件b的每一行都無條件執行{print a[$1]FS$2},此時變量$1爲第二個文件的第一個字段,與讀入第一個文件時,採用第一個文件的$2爲數組下標相同.因此可以在此輸出該數組的值。

使用方法

awk '{pattern + action}' {filenames}

儘管操作可能會很複雜,但語法總是這樣,其中 pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程序中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 pattern就是要表示的正則表達式,用斜槓括起來。

awk語言的最基本功能是在文件或者字符串中基於指定規則瀏覽和抽取信息,awk抽取信息後,才能進行其他文本操作。完整的awk腳本通常用來格式化文本文件中的信息。

通常,awk是以文件的一行爲處理單位的。awk每接收文件的一行,然後執行相應的命令,來處理文本。

調用awk

awk [-F  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項稱爲一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。


將把字符 h 作爲第二個字段的第一個字符和最後一個字符的所有記錄打印至標準輸出
#awk  '$2 ~ /^h/'  file
#awk  '$2 ~ /h$/'  file

# 刪除每行結尾的空白(包括空格符和製表符)
awk '{sub(/[ \t]+$/, "");print}'


linux 如何顯示一個文件的某幾行(中間幾行)

【一】從第3000行開始,顯示1000行。即顯示3000~3999行
cat filename | tail -n +3000 | head -n 1000
 
【二】顯示1000行到3000行
cat filename| head -n 3000 | tail -n +1000
 
*注意兩種方法的順序
 
分解:
    tail -n 1000:顯示最後1000行
    tail -n +1000:從1000行開始顯示,顯示1000行以後的
    head -n 1000:顯示前面1000行
 
【三】用sed命令
 
 sed -n '5,10p' filename 這樣你就可以只查看文件的第5行到第10行。



NF代表:瀏覽記錄的域的個數

$NF代表 :最後一個Field(列)

發佈了73 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章