awk search using variable

Hi Forum.

I have the following script that I would like to use a variable to search using awk but it's not working as expected:

# Define working variables
token_search_string=536088
token_search_length=16

This code example works by hardcoding 536088 in the string search:
awk -v token_search_string=$token_search_string -v token_search_length=$token_search_length '/536088/ {
    match($0, /token_search_string/); print substr($0, RSTART, token_search_length);
}' abc.txt


This code example doesn't work if I reference the token_search_string variable
awk -v token_search_string=$token_search_string -v token_search_length=$token_search_length '/token_search_string/ {
    match($0, /token_search_string/); print substr($0, RSTART, token_search_length);
}' abc.txt

What am I missing here?

Thanks for your help.

Awk does not do variable expansion within regex //
It is, literally, looking for the characters: token_search_string

Try

awk -v var=$var '$0 ~ var'

when you need to search in that way.

Try

awk -v token_search_string=$token_search_string -v token_search_length=$token_search_length '{
    match($0, token_search_string); if( RSTART>0 ){print substr($0, RSTART, token_search_length)}
}' abc.txt

As match returns zero when no match is found and position when one is, you could do:

awk -v token_search_string="$token_search_string" -v token_search_length=$token_search_length '
match($0, token_search_string)  {
    print substr($0, RSTART, token_search_length)
}' abc.txt

Thanks Guys for all your suggestions.

I have been told that my token_search_string has to be a list of entries.

How can I define the token_search_string containing a list of values such as 536088, 547698 and still have the above awk script work?

Do I need to loop thru the list of values and call the awk script for each value?

Thanks.

In the shell

token_search_string='536088|547698'
2 Likes

This is my updated code but having an issue:

token_search_string='536088|536000|536001'
token_search_length=16

awk -v token_search_string="$token_search_string" -v token_search_length=$token_search_length '
match($0, token_search_string)  {
print substr($0, RSTART, token_search_length) }'
/data/data2/staging/CREDIT_CARDS/TSYS/V888test.20150101.12010
Input file "V888test.20150101.12010" contains the following record with the search strings italics bolded:

000000000501AT31 0600 0000000 C  2015140 19066035360887343045008   5360887343045008   75360885140140111111121 DBT N      BOPURCHASE
          CAN0000000000000000                                                  00D        N   PR        00
    00000000000120000000000000000 0000000000    00000    1750010100010001000000006170000000124000112422                        N1       0000000 0000000008
2.48 20181350000 2015140 0000000010100  00000000101.00 00000000000.00 20151400000 0000000000000 0368968 2015140 00.000 0.0000 0000000 0000000 N         00
00000.00            0000000 00000000000.00CAN00103                                 0            0   00000001.000000000 00000000.0000000000 00000000001.01
             N        0000
Output is extracting value 5360887343045008 but not 5360885140140111.

How can I update the code so that it will extract multiple search strings within same record?

Please help.

Thanks

not tested....

awk -v token_search_string="$token_search_string" -v token_search_length=$token_search_length '
BEGIN {
  split(token_search_string, a, "|")
}
{
  for(i=1;i in a; i++)
    if (match($0, a))
      print substr($0, RSTART, token_search_length) 
}' /data/data2/staging/CREDIT_CARDS/TSYS/V888test.20150101.12010

Thanks vgersh99 - I tested your script but only got one output:

5360887343445758

Can you help?

BEGIN {
  split(token_search_string, a, "|")
}
{
{
  s=t=$0
  for(i=1;i in a; i++) {
    t=s
    while (match(t, a)) {
      print substr(t, RSTART, token_search_length)
      t=substr(t,RSTART+RLENGTH)
    }
  }
}
1 Like

Thank you very much for your quick response.

Much appreciated.

The script is working as expected!!!!!