Home > front end >  How to output city by IP address to stdout?
How to output city by IP address to stdout?

Time:11-21

I have a list of IP addresses in the ip.txt file (there are a lot of them). I used ipinfo.io services to search data by IP and sed to cut out only the city.

#!/bin/bash
while IFS= read -r ip; do
    curl ipinfo.io/$ip >> test.txt
    sed -i '/city/!d' test.txt
    cat /dev/null > test.txt
done < ip.txt

However, the script doesn`t display the city in a loop over all IPs (only works on individual data), but displays a lot of unnecessary information. For example, for the following IPs (generated automatically):

97.108.178.66
98.10.198.56
201.12.36.90

My output:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   332  100   332    0     0   2145      0 --:--:-- --:--:-- --:--:--  2155
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   323  100   323    0     0   1345      0 --:--:-- --:--:-- --:--:--  1340
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   266  100   266    0     0   1426      0 --:--:-- --:--:-- --:--:--  1430

Required output:

  "city": "Toronto",
  "city": "Rochester",
  "city": "Rio de Janeiro",

How can this be done?

CodePudding user response:

It's not clear whether you're trying to capture the cities in a text file or display them. If you want them stored, don't overwrite the results.

$ cat tmp 
#!/bin/bash
while IFS= read -r ip; do
    curl ipinfo.io/$ip >> test.txt 2>/dev/null
    sed -i '/city/!d' test.txt
done < ip.txt
$ cat ip.txt 
97.108.178.66
98.10.198.56
201.12.36.90
$ ./tmp 
$ cat test.txt 
  "city": "Toronto",
  "city": "Rochester",
  "city": "Rio de Janeiro",
$ 

If you just want to see them on screen:

$ cat tmp 
#!/bin/bash
while IFS= read -r ip; do
    curl ipinfo.io/$ip 2>&1 | sed  '/city/!d'
done < ip.txt
$ ./tmp 
  "city": "Toronto",
  "city": "Rochester",
  "city": "Rio de Janeiro",
$ 
  • Related