2011-11-16 194 views
1

以下命令按預期工作。我需要找到的是在第一或第三列中可用的線程ID。查找第一列或第三列

# tail -1000 general.log | grep Connect | egrep -v "(abc|slave_user)" 
       2856057 Connect [email protected] on 
111116 5:14:01 2856094 Connect [email protected] on 

若行之日起開始,選擇第三欄即2856094或第一列即2856057

Expected output: 
2856057 
2856094 

回答

5

另一種方式來看待它,你總是拿第四列從右邊算起:

awk '{ print $(NF-3) }' 

否則,如果日期是真的是唯一可靠的指標,試試這個:

awk -v Date=$(date "+%y%m%d") '$1 == Date { print $3; next } { print $1 }' 
+0

我建議使用「Connect」作爲指標:'awk'{print $ 2 ==「Connect」? $ 1:$ 3}'' –

+0

不應該是'awk'{print($ 2 ==「Connect」?$ 1:$ 3)}'' –

1

如果數據真的是定期(即所有列是固定的寬度) ,那麼你可以使用cut

tail -1000 general.log | grep Connect | egrep -v "(abc|slave_user)" | cut -c17-23 
0

不知道該文件的格式,也許嘗試:

$ tail -1000 general.log | grep Connect | egrep -v "(abc|slave_user)" | awk '{if ($3 == "[email protected]"){print $1;}else{print $3}}' 

或者,也許這會工作,其結構簡單:

$ awk '/Connect/ {if ($3 == "[email protected]"){print $1;}else{print $3}}' general.log 

我試過了。如果我錯了,或者有更好的辦法,我會及時學習。 :)

也許這使用int()??????

$ awk '/Connect/ {if (!int($3)){print $1;}else{print $3}}' general.log 
+0

這就近了。我需要的是 - awk'{if($ 3 ==「不是數字」){print $ 1;} else {print $ 3}}' – shantanuo

+0

也許這樣:$ awk'/ Connect/{if(!int($ 3 )){print $ 1;} else {print $ 3}}'general.log – coelmay

1

這可能會爲你工作:

tail -1000 general.log | sed -e '/abc\|slave_user/d;/ Connect.*/!d;s///;s/.* //' 
1

使用awk內置變量NF捕獲字段數量。如果它們等於6,則打印3列,否則打印第1列。

awk 'NF==6{ print $3;next } { print $1 }' INPUT_FILE