您的位置:首页 > 其它

awk,grep,sed三剑客

2018-10-08 21:04 489 查看

想学好“三剑客”最基本还是 正则表达式的熟练

正则表达式全集

日志的格式

2018/10/03 23:59:14.944 adapter.go:353: [warning] [SLOW_QUERY] cost_time:111.420169ms succ:true connection_id:0 txn_start_ts:403375431254540289 database: table_ids:[21] index_ids:[1] sql:select tab_id, is_ind, hist_id, distinct_count, version, null_count, tot_col_siz from mysql.stats_histograms where table_id = 40373
...
grep "[0-9]m[0-9]" slow-log-2018-10-06.log |awk -F":" '{print $6, $NF}' |sed 's/succ//g' > slow_sql-2018-10-08.log

grep "[4-6][0-9]\.[0-9]\{2,\}s" slow-log-2018-10-06.log

grep ":9[0-9][0-9]\." slow-log-2018-10-06.log |awk -F":" '{print $6, $13}' | grep 'limit'

awk

# 用awk打印除第一列之外的所有列,
awk '{for(i=2;i<=NF;++i) printf $i "\t";printf "\n"}' test.txt

# 上面的格式有时候会报错,导致过滤的部分数据丢失,printf加个括号就不报错了,为什么?
awk -F: '{printf $6 "\t";for(k=13;k<=NF;++k) printf("%s  ", $k);printf "\n"}'
# 有如下的log文件:
$ cat /tmp/hoge.data
2011-01-13 18:47:46  WARN HogeHoge - getData 180
2011-01-13 18:47:46  WARN HogeHoge - getData 485
2011-01-13 18:47:46  WARN HogeHoge - getData 405

# 最右边的数值表示数据。计算一下数据的和。
$ cat /tmp/hoge.data | awk '{ sum += $7 } END { print sum }'
1070

# 最开始的{} ,定义sum变量,累加数据。最后,在END内 print sum 输出和.

##然后,计算一下平均值。
$ cat /tmp/hoge.data | awk '{ sum += $7; } END { print "sum = " sum; print "average = " sum/NR }'
sum = 1070
average = 356.667
$ cat a.txt
苹果 5 kg
香蕉 8 kg
橘子 3 kg
香蕉 4 kg
苹果 8 kg
# 相加求和
awk '{sum[$1]+=$2}END{for(c in sum){print c,sum[c]}}' a.txt

# 统计
awk '{a[$1]+=1;} END {for(i in a){print a[i]" "i;}}' a.txt

### 如何sum并平均呢?

awk的其他用法

sed

# sed 去除所有空格
sed s/[[:space:]]//g
# #格式如:
#4.904638471s selectchannel_id,game_id,

sed '/[0-9]\{5,\}/ s/s//g' d.txt
sed '/[0-9]\{5,\}/ s/s\b//g' d.txt

# \b    匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
## 这 [0-9]和\d 不一样的用法吗?下面的没效果
sed '/\d{5,\}/ s/s//g' d.txt

grep

# 递归式搜索,当前文件和文件夹里面的文件也会被过滤
grep -ri "SQL_NO_CACHE"  *

# -v参数,取反
grep -v "update"  test.txt

Linux 命令——grep | 正则表达式

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息