Date substring from a string


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Date substring from a string
# 8  
Old 01-30-2015
Quote:
Originally Posted by usrrenny
Hi,

I tried the below.

while read line
do
Code:
if echo "$line" | grep -q "started at"
 then
 st= ${line#*started at}
 echo $st
 fi
done < $load_time

but getting output as
temp.ksh[35]: Thu Jan 29 15:01:17 CST 2015: not found [No such file or directory]

I should get output as 15:01:17
You can't have a space between the variable= and the value to be assigned to that variable. The syntax you used, sets st to an empty string and includes it in the environment of the command that follows. But that won't get rid of the Thu Jan 29 or the CST 2015

Note that your original post didn't say anything about the string started at appearing in the input (and was not in your sample input).

Assuming you're working in an English locale, you could try something like:
Code:
awk '
match($0, /[[:digit:]]{1,2}:[[:digit:]]{2}:[[:digit:]]{2} *([AP]M){0,1}/) {
	print substr($0, RSTART, RLENGTH)
}' file

The ERE can be simplified if you only have 24-hour format times.

With the following contents in your input file:
Code:
Nothing found on this line
 a.sh start time is Fri Jan  9 17:17:33 CST 2015
a.sh end time is Fri Jan  9 17:47:33 CST 2015
Single digit hour Fri Jan  9  5:50:59 PM CST 2015
Double digit hour Sat Jan 10 11:22:33 AM CST 2015
No space single Fri Jan  9  5:50:59PM CST 2015
No space double Sat Jan 10 11:22:33AM CST 2015

it produces the output:
Code:
17:17:33 
17:47:33 
5:50:59 PM
11:22:33 AM
5:50:59PM
11:22:33AM

Fairly simple changes would allow you to find more than one timestamp on a line.

If you want to try this on a Solaris/SunOS system, change awk to /usr/xpg4/bin/awk, /usr/xpg6/bin/awk, or nawk

Last edited by Don Cragun; 01-30-2015 at 07:32 PM.. Reason: Fix typo (s/value/variable/).
This User Gave Thanks to Don Cragun For This Post:
# 9  
Old 01-30-2015
Hello Don,

Thank you for nice code, I think we need to add --re-interval in that as follows as we are using ERE here.
Code:
awk --re-interval '
match($0, /[[:digit:]]{1,2}:[[:digit:]]{2}:[[:digit:]]{2} *([AP]M){0,1}/) {
print substr($0, RSTART, RLENGTH)
}'  Input_file

Output will be as follows.
Code:
17:17:33
17:47:33

Thanks,
R. Singh
# 10  
Old 01-30-2015
Hi Ravinder,
--re-interval (or --posix) is needed on gawk to get POSIX conforming EREs, but it is not needed for any version of awk that conforms to the POSIX standards.

The output that I showed in post #8 was the exact output produced by the awk command I showed in that thread when it was run on OS X Yosemite.
# 11  
Old 01-31-2015
Could be quite easier Smilie

Solution 1:
Code:
	awk '{print $8}' afile.txt

Option 2:
Code:
	while read vScript vStatus sTime sIs sDay sMonth sNum sTime sReg sYear
	do 	echo "$sTime"
	done<afile.txt

What you asked in first post, and what you described your post #7 does not match.
You're looking for the string "started at" but your example post #1, shows us there is only "start at".

If you care about the status, feel free to add a check for "vStatus", wether its "start" or "end".

hth
# 12  
Old 01-31-2015
Quote:
Originally Posted by bigsanch
If the string is allways the same structure, then you can do something like this:

Code:
string1='a.sh start time is Fri Jan  9 17:17:33 CST 2015';
string1=${string1%* CST 2015}
string1=${string1##* }

string2='a.sh start time is Fri Jan  9 17:17:33 CST 2015';
string2=${string2%* CST 2015}
string2=${string2##* }

clear && echo $string1 && echo "" && echo $string2

This will probably work for about half of a year's input assuming that all lines are in exactly the same format and that the CST is referring to US Central Standard timezone. It won't work when dayligth savings time is in effect. And, of course, it will only work for dates in 2015.

The following modifications should work year around for the sample input provided in 2015:
Code:
string1='a.sh start time is Fri Jan  9 17:17:33 CST 2015';
string1=${string1%* C?T 2015}
string1=${string1##* }

string2='a.sh start time is Fri Jun 12 17:17:33 CDT 2015';
string2=${string2%* C[DS]T 2015}
string2=${string2##* }

clear && echo $string1 && echo "" && echo $string2

The ? will match any character; the [DS] will match an uppercase D or an uppercase S. I will leave the modifications needed to recognize additional years as an exercise for the reader. If some of the dates being processed come from other timezones, I would suggest using a different approach.

Quote:
Originally Posted by senhia83
try

Code:
awk 'match($0, /([0-9]+):([0-5]?[0-9]):([0-5]?[0-9])/, ary) {print ary[1]":"ary[2]":"ary[3]}' yourfile

You seem to be mixing the awk match() and split() functions. But, I get a syntax error when I try this code. The match() function takes two arguments (string to be matched and an ERE to match) and sets various awk variables to indicate whether or not a match was found and, if there was a match, the starting position of the match and the length of the match. The awk script I suggested in post #8 in this thread uses match() this way.

The awk split() function creates an array of values corresponding to values separated by field separators specify by an ERE. With the ERE you use, the desired date would not appear in the array at all since the ERE selects the date as the field separator.
This User Gave Thanks to Don Cragun For This Post:
# 13  
Old 02-02-2015
Hi All, Thanks for replying. I tried Bigsanch's code modified by Don(#12). It worked fine for me. However need to do a thorough testing before implementing.

Also my original code wrked after removing the extra space after =(#8). But I am getting Thu Jan 29 15:01:17 CST 2015 in a variable. So I was looking if anyways I can extract only the time from the above.
# 14  
Old 02-02-2015
Quote:
Originally Posted by usrrenny
Hi All, Thanks for replying. I tried Bigsanch's code modified by Don(#12). It worked fine for me. However need to do a thorough testing before implementing.

Also my original code wrked after removing the extra space after =(#8). But I am getting Thu Jan 29 15:01:17 CST 2015 in a variable. So I was looking if anyways I can extract only the time from the above.
The "from the above" is a little ambiguous. There are suggestions above in this thread from several volunteers trying to help you, most of which try to just extract a timestamp from your sample data.

What operating system and shell are you using? As has been pointed out, some of the suggestions above will work on some systems but not on others.

Instead of just giving us two strings to parse, describe the strings you want to parse:
Will the timezone always be CST? Always CST or CDT? Always US timezones?
What range of years do you need to cover?
Are you looking for a 24hr time only or can there be 12hr times (with AM or PM) as well?
Is the date in your string always preceded by the literal string a.sh start time is? Why is there a space in front of that sometimes? If not, describe what will appear (number of words, anything containing a colon (:), etc.).
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Extracting substring within string between 2 token within the string

Hello. First best wishes for everybody. here is the input file ("$INPUT1") contents : BASH_FUNC_message_begin_script%%=() { local -a L_ARRAY; BASH_FUNC_message_debug%%=() { local -a L_ARRAY; BASH_FUNC_message_end_script%%=() { local -a L_ARRAY; BASH_FUNC_message_error%%=() { local... (3 Replies)
Discussion started by: jcdole
3 Replies

2. UNIX for Dummies Questions & Answers

Get date, change format and substring?

I'm somewhat new to shell scripting and I have a file that had a date in it. /somedirectory/datefile.txt I want to take the date in the file: 2013-06-12 and change the formate to 20130612 and have it as a variable/parm I also what to take that date 2013-06-12 and substring it. I know... (3 Replies)
Discussion started by: MJCreations
3 Replies

3. Shell Programming and Scripting

Remove a substring from string

Good morning friends, how can i remove a string with linux scripting from a file? In specific i want to remove from a file all the tweet names and links eg @aerta and links such as http://dst.co/pIiu3i9c Thanx!!! (4 Replies)
Discussion started by: paladinaeon
4 Replies

4. UNIX for Dummies Questions & Answers

substring a date

Hello I am trying to substring the month in a date string I am getting an error " bad substitution" #!/bin/ksh INPUT='20121225' echo ${$INPUT:5:2} exit 0 Very new in unix. Thanks. Please use code tags next time for your code and data. (9 Replies)
Discussion started by: lillyt2006
9 Replies

5. Shell Programming and Scripting

How to extract a substring from a string

Hi, I have an input string say for example: ABC,DEF,IJK,LMN,...,XYZ The above string is comma delimited. Now I have to extract the last part after the comma i.e. XYZ. :b: (3 Replies)
Discussion started by: bghosh
3 Replies

6. Shell Programming and Scripting

Help with string and substring also I/O

#!/bin/sh PRINTF=/usr/bin/printf PASSWD=/etc/passwd $PRINTF "Enter a UserID\n" read USERID if ; then $PRINTF "$USERID does not exist, please contact IT service\n" exit 1 fi USERHOME=`grep "^$USERID:" $PASSWD | awk -F : '{print $6}'` USERSHELL=`grep "^$USERID:"... (1 Reply)
Discussion started by: ikeQ
1 Replies

7. Shell Programming and Scripting

get substring from string

Hi All, Problem Description: XML_REP_REQUEST=`CONCSUB "$LOGIN" "SQLAP" "$RESP_NAME" "$USRNM" WAIT="Y" "CONCURRENT" "APPLICATION_SHORT_NAME" "CP_SHORT_NAME"` echo Report Request: $XML_REP_REQUEST --to print value in log file While execution the value of 'XML_REP_REQUEST' is 'Prozess... (5 Replies)
Discussion started by: suman.g
5 Replies

8. UNIX for Dummies Questions & Answers

How to get the substring from the string

Hi All, Can anybody help me to get the substring from the given string. (3 Replies)
Discussion started by: Anshu
3 Replies

9. Shell Programming and Scripting

getting a substring from a string

hi all, I am trying to extract SUBSTRINGS out of a string using ksh. The string is "SAPR3K.FD0.FA.TJ.B0010.T050302" I tried using a= `expr substr $stringZ 1 2` which is giving me a syntax error, donno why?? any ideas why its not working?? I also tried echo "welcome" | awk '{... (3 Replies)
Discussion started by: maradona
3 Replies

10. Programming

can i get a substring from a string?

for example, the string a is "abcdefg", can i get a substring "bcd" (from ato a) from string a? thank you (4 Replies)
Discussion started by: dell9
4 Replies
Login or Register to Ask a Question