linux命令面試題 1

2021-09-25 20:14:58 字數 4793 閱讀 7165

1. 顯示乙個檔案的第2000-5000行。

命令:

cat file | head -n  5000 | tail -n +2000  顯示2000行到5000行
解析:

tail -n +2000 表示的是從2000行開始顯示;

tail -n 2000 表示的是顯示檔案最後2000行,差別很大,注意靈活使用。

務必注意:head與tail的前後順序。

如果將tail 放前面,如下命令:

cat file | tail -n +2000 | head -n 5000

表示的是 : 從第2000行開始,共顯示5000行,也就是2000~6999行!

2. 將當前目錄下以".log"結尾且修改時間大於90天的5g以上的大檔案刪除。

命令:

find ./ -name "*.log" -type f -mtime +90 -size +10g -maxdepth 1 -print -exec rm {} \;
解析:

3. 有兩個檔案a和b,如下所示,請統計兩個檔案的交集、差集。

檔案a 檔案b

1 12 4

1 23 5

4 62 1

命令:

方法1 : 使用comm實現,配合sort和uniq命令

# 交集

comm -12 <

(sort a|uniq)

<

(sort b|uniq)

# 差集:a-b

comm -23 <

(sort a|uniq)

<

(sort b|uniq)

# 差集:b-a

comm -13 <

(sort a|uniq)

<

(sort b|uniq)

方法2:使用grep實現,結合 引數-vff

# 交集

grep -ff a b|sort|uniq

# 差集:a-b

grep -vff b a

# 差集:b-a

grep -vff a b

解析:

comm命令

"comm缺點:待比較檔案需要先(sort|uniq)預處理

grep命令

grep缺點:需要先對每個檔案進行空行刪除處理

4.有下面乙個檔案,請統計每行中每個元素出現的次數並按指定格式輸出:

檔案內容:

a a a b

b b c c c

d d d

輸出格式:

a:3 b:1

b:2 c:3

d:3

命令:
cat

file

|awk -f' '

''

解析:

該命令的主體是乙個awk語句:awk -f' ' '{}', 其中,-f指定每行的分隔符, '{}'是每行要執行的命令。

需要提醒的是awk、grep、sed這些文字處理命令,都是按行遍歷處理的。

首先我們提取awk核心語句'{}'中的內容:

根據分號提示,我們可以將其分為四個部分:

delete a;

先不管這個,看下乙個

遍歷每行每個列元素,把每個列元素出現的次數記錄下來。

for(i=1;i<=nf;i++) a[

$i]++;

其中,nf表示每行的總列數,、$i是該列具體內容

a[$​i]++是建立乙個陣列(字典),其中,key為$​i, value為$​i的出現次數。

通過for迴圈,遍歷每行的每個列,將各個列的出現次數進行了彙總求和。

每行統計完之後,列印統計陣列a

for(i in a)

printf i":"a[i]

"\t"

;

通過for迴圈,逐個列印該行統計字典a的每個item。

printf 是格式化輸出,列印完不回車。

該行統計結束後,最後要列印乙個回車符,然後繼續下一行的統計。

printf

"\n"

那麼問題來了,此時是不是應該將陣列a中的元素清除??想一想,如果不清楚a的話,遍歷後面行的時候,每個item會在前面統計次數的結果上繼續累加!

也就是我們上面跳過的第1步 :deleta a;它的作用是:

每行開始統計前,都要清空上一行的統計陣列a的內容,新行的統計結果會放到空的a中。

5.有乙個檔案如下,請統計每個廣告商的展示廣告總數和成單總數。

檔案內容:

advertiserid:0001 displaynum:100 ordernum:2

advertiserid:0001 displaynum:300 ordernum:4

advertiserid:0003 displaynum:500 ordernum:12

advertiserid:0004 displaynum:200 ordernum:8

輸出格式:

0001 400 6

0003 500 12

0004 200 8

命令:(雖然有點長,但是邏輯很清晰,請看解析拆解)
cat

file

|awk''|

awk' end'

解析:

該命令主要由兩個awk語句通過管道連線組成,對每個awk分別講解:

(1)第乙個awk:將所需要的字段匹配列印出來

通過執行第乙個awk語句,可以輸出下列格式:

0001 100 2

0001 300 4

0003 500 12

0004 200 8

awk

''

該部分的主體是兩個函式:match匹配函式和print函式。

match函式部分

格式:match(string,regex,array)

引數介紹

string是要匹配的字串

regex是正規表示式

array是匹配出內容的儲存陣列

因此,回到我們的match匹配例子。

match($0,/advertiserid:([0-9]*) displaynum:([0-9]*) ordernum:(.*)/,a);
第1個引數我們使用$0,也就是一整行。

第2個引數是乙個匹配表示式:

/advertiserid:(

[0-9]*) displaynum:(

[0-9]*) ordernum:(.*)/

表示式需要兩個「/」作為start和end標誌,後續需要用到的item需要用()括起來。

第3個引數是乙個陣列名稱,我們用a表示,這樣陣列a就可以將前面的三個()裡面的item存下來了。

print部分

print a[1],a[2],a[3];
這個語句的作用就是:將每行統計陣列a中的各個統計項列印出來。

總結:第乙個awk的作用是將我們需要的字段匹配出來,並統計好,列印出來。

(2)第二個awk:根據advertiserid彙總各行

首先,重申一下第乙個awk執行完之後的輸出結果:

0001 100 2

0001 300 4

0003 500 12

0004 200 8

第二個awk的內容是:

awk

' end'

主要包括兩個部分: 每行執行語句和end{}結束語句。

每行執行語句

這裡,可以把 a 理解為乙個python字典,key是廣告商id,也就是第乙個awk執行後輸出結果的$1。

value是乙個陣列,儲存兩個資料:

因此,通過執行上面的語句,可以將每個廣告商的廣告展示數和成單數進行彙總。

注意:

本題和第一題不同的是,不用再執行每一行時,清空a中的元素,因為本題是對所有行進行廣告商維度的匯**計,而不是統計完每行都要彙總一下。

end{}結束語句

end{}語句的執行時機是:awk對所有的行遍歷彙總完之後,彙總結果保留在字典a中。

通過執行下面語句,可以將彙總字典a中的各項內容清晰列印出來:

end
其中,i是廣告商id,a[i][0]是該廣告商的廣告展示數,a[i][1]是成單數。

微軟面試題 1

題 編寫反轉字串的程式,要求優化速度 優化空間。分析 構建兩個迭代器p 和 q 在一次遍歷中,p的位置從字串開頭向中間前進,q從字串末尾向中間後退,反轉字串只要每次遍歷都交換p和q所指向的內容即可,直到p和q在中間相遇,這時迴圈次數剛好等於 字串的長度 2。實現 view plain author ...

陣列 面試題1

面試題 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。分析思路 因為每一行從左到右是遞增,從上到下是遞減的,從左下角元素開始判斷,如果大於指定的元素,則向上,如果小於,則向右 pu...

邏輯面試題(1)

兩人玩遊戲,在腦門上貼數字 正整數 1 只看見對方的,看不見自己的,而且兩人的數字相差1,以下是兩人的對話 a 我不知道 b 我也不知道 a 我知道了 b 我也知道了 問a頭上的字是多少,b頭上的字是多少 一開始兩個人都能看到對方頭上的數字,所以心裡肯定是由兩個備份答案的。第一輪a說不知道,b也說不...