找到第一列或第三列

时间:2011-11-16 05:31:21

标签: shell awk grep

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

# tail -1000 general.log | grep Connect | egrep -v "(abc|slave_user)"
                2856057 Connect root@localhost on 
111116  5:14:01 2856094 Connect root@localhost on 

如果该行以日期开头,请选择第三列,即2856094或第一列,即2856057

Expected output:
2856057
2856094

5 个答案:

答案 0 :(得分:5)

另一种看待它的方法是,从右边开始计算时总是采用第四列:

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

否则,如果日期确实是唯一可靠的指标,请尝试:

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

答案 1 :(得分:1)

如果您的数据确实是常规数据(即所有列都是固定宽度),那么您可以使用cut

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

答案 2 :(得分:1)

这可能对您有用:

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

答案 3 :(得分:1)

使用awk内置变量NF来捕获字段数。如果它们等于6则打印3列,否则打印第1列。

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

答案 4 :(得分:0)

在不知道文件格式的情况下,可以尝试:

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

或者这可能会更简单:

$ awk '/Connect/ {if ($3 == "root@localhost"){print $1;}else{print $3}}' general.log

我试过了。如果我错了,或者有更好的方法,我会及时学习。 :)

也许这使用int()??????

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