executable
executable

Reputation: 3600

Grep first line which contain a date

I'm trying to fetch the first line in a log file which contain a date. Here is an example of the log file :

SOME
LOG


2021-1-1 21:50:19.0|LOG|DESC1 
2021-1-4 21:50:19.0|LOG|DESC2
2021-1-5 21:50:19.0|LOG|DESC3
2021-1-5 21:50:19.0|LOG|DESC4

In this context I need to get the following line:

2021-1-1 21:50:19.0|LOG|DESC1

An other log file example :

SOME
LOG


21-1-3 21:50:19.0|LOG|DESC1 
21-1-3 21:50:19.0|LOG|DESC2
21-1-4 21:50:19.0|LOG|DESC3
21-1-5 21:50:19.0|LOG|DESC4

I need to fetch :

21-1-3 21:50:19.0|LOG|DESC1 

At the moment I tried the following command :

cat /path/to/file | grep "$(date +"%Y-%m-%d")" | tail -1
cat /path/to/file | grep "$(date +"%-Y-%-m-%-d")" | tail -1
cat /path/to/file | grep -E "[0-9]+-[0-9]+-[0-9]" | tail -1

Upvotes: 0

Views: 791

Answers (5)

Ed Morton
Ed Morton

Reputation: 203607

$ grep -m1 '^[0-9]' file1
2021-1-1 21:50:19.0|LOG|DESC1

$ grep -m1 '^[0-9]' file2
21-1-3 21:50:19.0|LOG|DESC1

If that's not all you need then edit your question to provide more truly representative sample input/output.

Upvotes: 2

dawg
dawg

Reputation: 103844

This sed works with either GNU or POSIX sed:

sed -nE '/^[[:digit:]]{2,4}-[[:digit:]]{1,2}-[[:digit:]]{1,2}/{p;q;}' file

But awk, with the same BRE, is probably better:

awk '/^[[:digit:]]{2,4}-[[:digit:]]{1,2}-[[:digit:]]{1,2}/{print; exit}' file

Upvotes: 1

anubhava
anubhava

Reputation: 785186

A simple grep with -m 1 (to exit after finding first match):

grep -m1 -E '^([0-9]+-){2}[0-9]+ ([0-9]{2}:){2}[0-9]+\.[0-9]+' file1
2021-1-1 21:50:19.0|LOG|DESC1

grep -m1 -E '^([0-9]+-){2}[0-9]+ ([0-9]{2}:){2}[0-9]+\.[0-9]+' file2
21-1-3 21:50:19.0|LOG|DESC1

Upvotes: 1

glenn jackman
glenn jackman

Reputation: 246827

Using sed, being not too concerned about exactly how many digits are present:

sed -En '/^[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+[.][0-9]+[|]/ {p; q}' file

Upvotes: 3

RavinderSingh13
RavinderSingh13

Reputation: 133528

In case you are ok with awk, could you please try following. This will find the matched regex first line and exit from program, which will be faster since its NOT reading whole Input_file.

awk '
/^[0-9]{2}([0-9]{2})?-[0-9]{1,2}-[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]+/{
  print
  exit
}' Input_file

Upvotes: 4

Related Questions