如何从Linux

时间:2017-09-07 04:51:25

标签: regex awk sed grep

我在linux系统中有一个日志文件(.txt格式)。想要提取以" 1499"开头的所有数据并写入另一个文件。日志中有两种类型的数据,一种是13位长,另一种是38位长。

我想要grep,sed或awk命令的任何建议。

日志文件示例:

1499186243519, 36533, 0, 0, 0, 0, 0, 0, 0, 0
1499186244816, 35237, 0, 0, 0, 0, 0, 0, 0, 0
1499186244837, 35224, 0, 0, 0, 0, 0, 0, 0, 0
1499182567904?
1499182567982 -> 200 OK, 0 bytes
1499182568007?
14991855787919196616688454500234291584**
14991855788021403876667136479787697727**
14991855803593386396169567154870815462**

输出应如下所示:

1499186243519
1499186244816
1499186244837
1499182567904
1499182567982
1499182568007
14991855787919196616688454500234291584
14991855788021403876667136479787697727
14991855803593386396169567154870815462

5 个答案:

答案 0 :(得分:3)

假设:

$ echo "$log"
1499186243519, 36533, 0, 0, 0, 0, 0, 0, 0, 0
1499186244816, 35237, 0, 0, 0, 0, 0, 0, 0, 0
1499186244837, 35224, 0, 0, 0, 0, 0, 0, 0, 0
1499182567904?
1499182567982 -> 200 OK, 0 bytes
1499182568007?
14991855787919196616688454500234291584**
14991855788021403876667136479787697727**
14991855803593386396169567154870815462**

你可以这样做:

$ echo "$log" | sed -E 's/^(1499[[:digit:]]*).*$/\1/'
1499186243519
1499186244816
1499186244837
1499182567904
1499182567982
1499182568007
14991855787919196616688454500234291584
14991855788021403876667136479787697727
14991855803593386396169567154870815462

这也有效:

$ sed -E 's/^(1499[[:digit:]]*).*$/\1/' file

file拥有该内容......

awk

$ echo "$log" | awk -F[^0-9] '/^1499/{print $1}'

或者grep:

$ echo "$log" | grep -o '^1499[[:digit:]]*'

答案 1 :(得分:0)

使用GNU grep和扩展正则表达式(-E):

grep -Eo -e '^1499[0-9]{9}' -e '^1499[0-9]{34}' file

输出:

1499186243519
1499186244816
1499186244837
1499182567904
1499182567982
1499182568007
14991855787919196616688454500234291584
14991855788021403876667136479787697727
14991855803593386396169567154870815462

答案 2 :(得分:0)

使用Bash:

$ while read -r;do [[ $REPLY =~ ^1499[0-9]* ]] && echo ${BASH_REMATCH} >>new_log.txt;done <log.txt

$ cat new_log.txt
1499186243519
1499186244816
1499186244837
1499182567904
1499182567982
1499182568007
14991855787919196616688454500234291584
14991855788021403876667136479787697727
14991855803593386396169567154870815462

答案 3 :(得分:0)

GNU awk 版本,打印长度为13或38的数字,即使同一行上有 多个 : / p>

$ awk -v p="([[:digit:]]{38}|[[:digit:]]{13})" '{for (i=1; i<=NF; i++){ if (match($i, p, a)) print a[1]}}' input.txt

输入:

$ cat input.txt
1499186243519, 36533, 0, 0, 0, 0, 0, 0, 0, 0, 14991855803593386396169567154870815462**
1499186244816, 35237, 0, 0, 0, 0, 0, 0, 0, 0
1499186244837, 35224, 0, 0, 0, 0, 0, 0, 0, 0
1499182567904?
1499182567982 -> 200 OK, 0 bytes
1499182568007?
14991855787919196616688454500234291584**
14991855788021403876667136479787697727**
14991855803593386396169567154870815462**

给出:

$ awk -v p="([[:digit:]]{38}|[[:digit:]]{13})" '{for (i=1; i<=NF; i++){ if (match($i, p, a)) print a[1]}}' input.txt
1499186243519
14991855803593386396169567154870815462
1499186244816
1499186244837
1499182567904
1499182567982
1499182568007
14991855787919196616688454500234291584
14991855788021403876667136479787697727
14991855803593386396169567154870815462

答案 4 :(得分:0)

GREP COMMAND

  

grep -Eo“^([1] [4] [9] [9] [0-9] {1,13} | [1] [4] [9] [9] [0-9] { 1,38})“abc.txt

使用-E访问扩展正则表达式语法

  • 设置-o只输出该行的匹配段,而不是该行的全部内容

    ^表示模式中字符串的开头。 1499是在开始后固定的字符串模式,之后可以跟随任何数字,长度可以是13位和38位。