以下命令按预期工作。我需要找到的是第一列或第三列中可用的线程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
答案 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