UNIX / Linux keyboard.

A Simple Log Cleaner for Apache referer_log

How to filter the Apache referrer log and see the search strings being used to find your pages.

Apache Logs

The Apache web server can maintain a log of "referrers" if you ask it to. When a client loads a page, Apache recorded the request in the file /var/www/logs/access_log and, if this is enabled, the referring page is recorded in /var/www/logs/referer_log.

Yes, I know that's spelled funny, that's simply how Apache wants to spell it.

Let's say a remote user using a client machine at IP address 1.2.3.4 was reading someone else's page http://somehost.com/. They see a hyperlink pointing to one of your page, http://yourhost.com/somepage.html. Two things are logged on your server when the user clicks on that link:

First, /var/www/logs/access_log gets a new line, looking something like this:

1.2.3.4 - - [29/Sep/16:07:09:23 -0500] "GET /somepage.html HTTP/1.1" 200 7340

Second, /var/www/logs/referer_log gets a new line, looking something like this:

1.2.3.4 -- http://somehost.com/blah/blah.html -> /somepage.html

Now that's kind of interesting, it shows you the pages on the Internet with static links pointing to your pages. What many people find more interesting is the list of search strings people have entered at Google and other search engines to reach your pages.

We can do this, the referring URL includes the search engine hostname and path to its search page, as well as the search string itself! However, that takes a little massaging before it's easy to read. Here is an example. This is really one line of 241 characters, I have broken it at 80 columns so it fits in your browser:

81.184.32.18 -- http://www.google.es/search?hl=es&client=firefox-a&rls=org.mozil
la:es-ES:official&hs=GMa&ei=1KlwSomeMIysjAf8l4SZBQ&sa=X&oi=spell&resnum=0&ct=res
ult&cd=1&q=packet+sniffing+tools+for+windows&spell=1 -> /cybersecurity/monitoring.html

Analyzing Referrer URLs

Look at that a piece at a time. The client is at IP address 81.184.32.18, which resolves back to a hostname of 81.184.32.18.dyn.user.ono.com. That IP address belongs to an Internet service provider in Aravaca, Spain, according to the whois output:

inetnum:        81.184.0.0 - 81.184.88.255
netname:        MENTA-CABLEMODEMS
descr:          AUNA - CTC
descr:          Internet de Banda Ampla
descr:          CableModem
country:        ES
[....]
role:           Techauna AUNA
address:        C/ Basauri, 7-9 La Florida, Aravaca
address:        Aravaca (28023)
address:        Spain
phone:          +34911809300

The client did a search from the page http://www.google.es/search, Google's Spanish language search interface. The rest of the referring URL is a collection of variable=value pairs strung together with the ampersand character, &. They specify things like the client's browser, preferred languages, whether Google should do spell checking and the type and number of results desired, and so on. The query itself is specified by q=..., can you find it?

There it is, almost at the end. They asked the Spanish Google page an English query:

packet sniffing tools for windows

Google has made that list of strings into a single string with + characters between the original components. Here it is, highlighted:

81.184.32.18 -- http://www.google.es/search?hl=es&client=firefox-a&rls=org.mozil
la:es-ES:official&hs=GMa&ei=1KlwSomeMIysjAf8l4SZBQ&sa=X&oi=spell&resnum=0&ct=res
ult&cd=1&q=packet+sniffing+tools+for+windows&spell=1 -> /cybersecurity/monitoring.html

From the list of search results, they clicked on the link to my page about protocol analysis, network monitoring, and packet sniffing. Really, that enormously long Google URL is the search result page itself. The user clicked on something on that dynamically generated search result page that led to my page.

This doesn't look too bad, but there are three things to look out for.

First, not all search engines use q=. Yahoo uses p=. Mywebsearch.com uses searchfor=, which I'm going to remap to q= in an early step.

Second, some searches contain similar variables like aq=... or oq=... when we're expecting q=... on Google. So, we have to be careful about simply saying "Everything after the q= or p= will be the search query." The variable=value pairs don't appear in any predictable order, so we can't look for the first or last instance of q= or p=.

The trick is to notice that the list of variable=value pairs starts after a question mark, ?, and is separated by ampsersands, &. So, the criteria is really: "Everything after either ?q= or &q= or ?p= or &p= will be the search query."

Well, no, not everything after either of those two strings — just everything up to either another ampersand (starting the next variable=value pair) or a blank space (the query happened to be the last one).

Third, the search engine and the client's browser may replace some characters with their ASCII codes. Instead of a literal space character, there will be %20 because the ASCII code for the space character is hexadecimal 0x20. Here's an example with a punctuation mark. The user typed TCP/IP Class handouts and the slash character / was replaced with the ASCII code %2F. That could appear as either %2F or %2f, we have to account for both upper and lower case ASCII codes.

209.136.52.205 -- http://www.google.com/search?hl=en&q=TCP%2FIP+Class+handouts&aq=f&oq=&aqi= -> /networking/

The Solution

What we want to do to each line is:

  1. Except for ASCII code %25, which is a literal %, replace every %xx ASCII code with the corresponding character.
  2. Now replace every %25 with a literal %.
  3. Delete all characters up to the first instance of any one of ?q= or &q= or ?p= or &p=.
  4. If there are any remaining variable=value pairs, delete them. That is, delete everything from the next & up to the string ->.
  5. Replace every + character with a blank space.

This is just one big sed command! Instead of a bunch of sed commands piped together, I can just run one with multiple edit strings. I have put it in a file, a one-line shell script:

#!/bin/sh

# Clean up search strings from /var/www/logs/referer_log

sed -e 's/%[01]./ /g' \
	-e 's/%20/ /g' \
	-e 's/%21/!/g' \
	-e 's/%22/"/g' \
	-e 's/%23/#/g' \
	-e 's/%24/$/g' \
	-e 's/%26/\&/g' \
	-e "s/%27/'/g" \
	-e 's/%28/(/g' \
	-e 's/%29/)/g' \
	-e 's/%2[Aa]/*/g' \
	-e 's/%2[Bb]/+/g' \
	-e 's/%2[Cc]/,/g' \
	-e 's/%2[Ee]/./g' \
	-e 's/%2[Dd]/-/g' \
	-e 's@%2[Ff]@/@g' \
	-e 's/%30/0/g' \
	-e 's/%31/1/g' \
	-e 's/%32/2/g' \
	-e 's/%33/3/g' \
	-e 's/%34/4/g' \
	-e 's/%35/5/g' \
	-e 's/%36/6/g' \
	-e 's/%37/7/g' \
	-e 's/%38/8/g' \
	-e 's/%39/9/g' \
	-e 's/%3[Aa]/:/g' \
	-e 's/%3[Bb]/;/g' \
	-e 's/%3[Cc]/</g' \
	-e 's/%3[Dd]/=/g' \
	-e 's/%3[Ee]/>/g' \
	-e 's/%3[Ff]/?/g' \
	-e 's/%40/@/g' \
	-e 's/%5[Bb]/\[/g' \
	-e 's/%5[Cc]/\\/g' \
	-e 's/%5[Dd]/\]/g' \
	-e 's/%5[Ee]/^]/g' \
	-e 's/%5[Ff]/_]/g' \
	-e 's/%60/`/g' \
	-e 's/%7[Bb]/{]/g' \
	-e 's/%7[Cc]/|]/g' \
	-e 's/%7[Dd]/}]/g' \
	-e 's/%7[Ee]/~]/g' \
	-e 's/%25/%/g' \
	-e 's/?searchfor=/?q=/' \
	-e 's/.*[?&][pq]=//' \
	-e 's/&.*=.* ->/ ->/' \
	-e 's/+/ /g' \
	-e 's/  */ /g' \
	-e 's/^ //'

Using That Program

I have that shell script in a directory in my command search path, ~/bin/script/log-clean as I've organized things. Notice that it ignores any command-line parameters, it simple reads from standard input and writes to standard output. That's because I want to be able to easily use it in various ways:

What are all the searches?  Generally speaking, searches
contain "=".  Google image searches contain "imgurl=" and
they aren't as useful for this analysis.
  % grep "=" /var/www/logs/referer_log | grep -v "imgurl=" | log-clean

What about just Google non-image searches?
  % grep "google" /var/www/logs/referer_log | grep -v images.google | log-clean

What about Google vs Yahoo?
  % grep "google" /var/www/logs/referer_log | grep -v "imgurl=" | log-clean
  % grep "yahoo" /var/www/logs/referer_log | log-clean

Those work, but they aren't very useful because they simply print the cleaned versions in the order in which they occurred. Here is a much more interesting question that we can now easily answer:

What is the complete list of searches used to find my pages, sorted in order of popularity? I would like to know the search string itself, how many times that was used, and its rank. Oh, and since people are erratic about capitalization, and some people think that Google pays more attention if you SHOUT IN ALL CAPS, I should force the queries to all lower case before doing the analysis. Oh, and I don't want to know about strange things that only happened once or a few times, let's limit this to searches done 10 times or more. Does this sound like a complicated request? This is easy in Unix!

% grep "=" /var/www/logs/referer_log | grep -v "imgurl=" |       \
        log-clean |                                              \
	tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | awk '$1 > 9' | cat -n

KEY:
  log-clean     We already know what this does...
  tr            Replaces upper case with lower case.
  sort          Reorder the lines into lexicographic order,
                grouping identical lines together.
  uniq -c       Counts sequences of identical lines, replacing
                each block with the count and the line content.
  sort -nr      Reorder the lines into reverse numerical order, numerical
                because of the -n and reverse order because of the -r.
  awk '$1 > 9'  Only output those lines where field #1
                is numerically greater than 9.
  cat -n        Insert line numbers before each line.

And what is the result of that?

Here are the results for a log covering about six weeks. The Internet is a very strange place....

     1	983 turkish grammar -> /turkish/
     2	396 build linux kernel -> /linux/linux-kernel.html
     3	327 toilets of the world -> /toilet/
     4	252 build kernel -> /linux/linux-kernel.html
     5	176 confederation of the lusitanian union -> /cybersecurity/netusers/Index/pt
     6	158 how to build linux kernel -> /linux/linux-kernel.html
     7	140 toilets -> /toilet/
     8	139 linux kernel build -> /linux/linux-kernel.html
     9	134 latex cyrillic -> /russian/latex.html
    10	123 turkish verbs -> /turkish/verbs.html
    11	120 building linux kernel -> /linux/linux-kernel.html
    12	 99 adsense xhtml -> /technical/google-adsense-and-xhtml.html
    13	 93 net.ipv4.tcp_max_syn_backlog -> /cybersecurity/stack-hardening.html
    14	 89 sniffing tools -> /cybersecurity/monitoring.html
    15	 85 how to build kernel -> /linux/linux-kernel.html
    16	 84 make kernel -> /linux/linux-kernel.html
    17	 84 histogram equalization -> /3d/histogram/
    18	 81 network sniffing tools -> /cybersecurity/monitoring.html
    19	 80 linux build kernel -> /linux/linux-kernel.html
    20	 78 net.ipv4.conf.all.rp_filter -> /cybersecurity/stack-hardening.html
    21	 78 kernel build -> /linux/linux-kernel.html
    22	 78 confederation lusitanian union -> /cybersecurity/netusers/Index/pt
    23	 74 cr0 net code network -> /cybersecurity/monitoring.html
    24	 72 toilets around the world -> /toilet/
    25	 69 oscilloscope probes -> /radio/probes.html
    26	 67 oscilloscope probe -> /radio/probes.html
    27	 66 cyrillic latex -> /russian/latex.html
    28	 64 european toilets -> /toilet/see.html
    29	 62 stainless steel toilet -> /toilet/stainless.html
    30	 62 pictures of toilets -> /toilet/
    31	 59 unix ipconfig -> /networking/commands.html
    32	 59 toilet -> /toilet/
    33	 57 computer network security -> /cybersecurity/
    34	 56 turkish grammar -> /turkish/background.html
    35	 56 how to build a linux kernel -> /linux/linux-kernel.html
    36	 56 confutatis maledictis -> /fun/latin.html
    37	 55 linux ip config -> /networking/commands.html
    38	 54 network sniffing -> /cybersecurity/monitoring.html
    39	 53 movie concepts -> /fun/brilliant-movie-ideas/
    40	 53 lan monitoring -> /cybersecurity/monitoring.html
    41	 51 what is ipsec -> /networking/what-is-ipsec.html
    42	 51 ardennes forest -> /travel/belgium/bastogne-ardennes/
    43	 50 how linux boots -> /linux/linux-boot.html
    44	 49 how to build a kernel -> /linux/linux-kernel.html
    45	 48 compile linux kernel -> /linux/linux-kernel.html
    46	 47 sniffing tool -> /cybersecurity/monitoring.html
    47	 46 roman toilets -> /toilet/imperialroman.html
    48	 46 human toilets -> /toilet/nonhuman.html
    49	 44 tcp_strong_iss -> /cybersecurity/stack-hardening.html
    50	 43 how to make a kernel -> /linux/linux-kernel.html
    51	 43 how to compile linux kernel -> /linux/linux-kernel.html
    52	 42 steampunk projects -> /steampunk/
    53	 41 ipconfig commands -> /networking/commands.html
    54	 40 kernel make -> /linux/linux-kernel.html
    55	 40 ghostbusters headquarters -> /travel/usa/ghostbusters/
    56	 40 cncgroup hebei province network -> /cybersecurity/ssh-attack-study.html
    57	 39 verify digital signature -> /cybersecurity/verify-digital-signature.html
    58	 38 contrast enhancement -> /3d/histogram/
    59	 38 ardennes forest map -> /travel/belgium/bastogne-ardennes/
    60	 37 unix ip config -> /networking/commands.html
    61	 37 turkish grammar online -> /turkish/background.html
    62	 35 how to use ftp in linux -> /linux/ftp-howto.html
    63	 34 turkish suffixes -> /turkish/turkish-suffixes.html
    64	 34 sendmail ssl -> /linux/sendmail-ssl.html
    65	 34 protocol header -> /networking/protocols.html
    66	 34 learn turkish grammar -> /turkish/
    67	 34 ipconfig linux -> /networking/commands.html
    68	 33 wireless sniffing windows -> /cybersecurity/monitoring.html
    69	 33 unix ip commands -> /networking/commands.html
    70	 33 cisco catalyst 2900 -> /networking/switch-programming.html
    71	 32 www.alqaida.com -> /cybersecurity/netusers/Index/aq
    72	 32 wan link -> /networking/wan-specs.html
    73	 32 oscilloscope probe circuit -> /radio/probes.html
    74	 31 turkish pronouns -> /turkish/nouns.html
    75	 31 linux ip config command -> /networking/commands.html
    76	 31 computer system security -> /cybersecurity/
    77	 31 build kernel linux -> /linux/linux-kernel.html
    78	 30 world toilets -> /toilet/
    79	 30 turkish grammar -> /turkish/nouns.html
    80	 30 stainless steel toilets -> /toilet/stainless.html
    81	 30 build linux -> /linux/linux-kernel.html
    82	 30 7 deadly sins spear street google secret service -> /cybersecurity/cyberwar.html
    83	 29 linux kernel compile -> /linux/linux-kernel.html
    84	 29 how routing works -> /networking/routing.html
    85	 28 jim morrison paris -> /travel/france/jim-morrison-paris.html
    86	 28 http://www.cr0.net:8040/code/network/ -> /cybersecurity/monitoring.html
    87	 28 dover tunnels -> /travel/uk/dover/
    88	 28 building kernel -> /linux/linux-kernel.html
    89	 27 wan links -> /networking/wan-specs.html
    90	 27 turkish grammar -> /turkish/verbs.html
    91	 27 ipconfig unix -> /networking/commands.html
    92	 27 ghostbusters headquarters building -> /travel/usa/ghostbusters/
    93	 27 ghostbusters -> /travel/usa/ghostbusters/
    94	 26 unix commands ip -> /networking/commands.html
    95	 26 linux ip configuration command -> /networking/commands.html
    96	 26 jim morrison in paris -> /travel/france/jim-morrison-paris.html
    97	 26 how to build the linux kernel -> /linux/linux-kernel.html
    98	 26 free computer forensic tools -> /cybersecurity/forensics.html
    99	 26 chimera turkey -> /travel/turkey/olimpos/
   100	 26 bastogne battle of the bulge -> /travel/belgium/bastogne-ardennes/
   101	 26 adaptive histogram equalization -> /3d/histogram/
   102	 25 train toilets -> /toilet/train.html
   103	 25 tektronix 2445a -> /radio/tek2445a.html
   104	 25 lan monitoring tool -> /cybersecurity/monitoring.html
   105	 25 intrusion detection tools -> /cybersecurity/intrusion.html
   106	 25 eastern toilets -> /toilet/
   107	 25 confutatis maledictis flammis acribus addictis -> /fun/latin.html
   108	 25 asian toilets -> /toilet/
   109	 24 turkish basics -> /turkish/
   110	 24 jim morrison -> /toilet/france.html
   111	 24 highest peak in scotland -> /travel/uk/ben-nevis/
   112	 23 lan monitoring tools -> /cybersecurity/monitoring.html
   113	 23 basic turkish grammar -> /turkish/
   114	 23 ancient toilets -> /toilet/
   115	 22 network sniffing tool -> /cybersecurity/monitoring.html
   116	 22 building a linux kernel -> /linux/linux-kernel.html
   117	 22 british toilets -> /toilet/britain.html
   118	 21 verifying digital signature -> /cybersecurity/verify-digital-signature.html
   119	 21 turkish grammar rules -> /turkish/
   120	 21 toilets of the world -> /toilet/middle-east.html
   121	 21 small hf antenna -> /radio/hf-short-dipoles.html
   122	 21 oliver cromwell -> /oliver-cromwell/
   123	 21 net.inet.ip.redirect -> /cybersecurity/stack-hardening.html
   124	 21 linux ip configuration -> /networking/commands.html
   125	 21 ip config linux -> /networking/commands.html
   126	 21 image contrast enhancement -> /3d/histogram/
   127	 20 turkish language grammar -> /turkish/background.html
   128	 20 ssh access control -> /linux/ssh.html
   129	 20 ipconfig in unix -> /networking/commands.html
   130	 20 how nat works -> /networking/nat.html
   131	 20 eastern toilets -> /toilet/see.html
   132	 20 build a linux kernel -> /linux/linux-kernel.html
   133	 19 make linux kernel -> /linux/linux-kernel.html
   134	 19 linux tcp ip commands -> /networking/commands.html
   135	 19 how to make kernel -> /linux/linux-kernel.html
   136	 19 hieropolis -> /travel/turkey/pamukkale/
   137	 18 unix display ip address -> /networking/commands.html
   138	 18 rc.sysinit in linux -> /linux/linux-boot.html
   139	 18 jenny mccarthy -> /fun/brilliant-movie-ideas/news.html
   140	 18 hotel de medicis paris -> /travel/france/jim-morrison-paris.html
   141	 18 futuristic toilets -> /toilet/hightech.html
   142	 18 avebury uk -> /travel/uk/avebury/
   143	 18 asian toilets -> /toilet/middle-east.html
   144	 17 unix show ip address -> /networking/commands.html
   145	 17 unix ip command -> /networking/commands.html
   146	 17 turkish vowel harmony -> /turkish/orthography.html
   147	 17 toilet squatting platform -> /toilet/install.html
   148	 17 stainless toilets -> /toilet/stainless.html
   149	 17 packet sniffing tools -> /cybersecurity/monitoring.html
   150	 17 linux kernel build howto -> /linux/linux-kernel.html
   151	 17 ipconfig in linux -> /networking/commands.html
   152	 17 ipconfig for linux -> /networking/commands.html
   153	 17 ip config unix -> /networking/commands.html
   154	 17 grammar turkish -> /turkish/
   155	 17 build oscilloscope probe -> /radio/probes.html
   156	 16 network monitoring tools -> /cybersecurity/monitoring.html
   157	 16 french toilets -> /toilet/links.html
   158	 16 deaths on ben nevis -> /travel/uk/ben-nevis/
   159	 16 cyrillic in latex -> /russian/latex.html
   160	 16 cisco 3550 -> /networking/switch-programming.html
   161	 16 ben nevis deaths -> /travel/uk/ben-nevis/
   162	 16 arlington hall -> /travel/usa/us-wash-ah.html
   163	 15 wlan sniffing -> /cybersecurity/monitoring.html
   164	 15 toilet of the world -> /toilet/
   165	 15 strait gallipoli peninsula -> /travel/turkey/gallipoli/
   166	 15 make oscilloscope probe -> /radio/probes.html
   167	 15 linux network sniffing tools -> /cybersecurity/monitoring.html
   168	 15 linux build -> /linux/linux-kernel.html
   169	 15 how to verify digital signature -> /cybersecurity/verify-digital-signature.html
   170	 15 how to compile kernel -> /linux/linux-kernel.html
   171	 15 hardening openbsd -> /cybersecurity/linux-hardening.html
   172	 15 hardening linux -> /cybersecurity/linux-hardening.html
   173	 15 guangxi filterui:photo-photo -> /toilet/revolutionPRC.html
   174	 15 ghostbusters locations -> /travel/usa/ghostbusters/
   175	 15 free computer forensics tools -> /cybersecurity/forensics.html
   176	 15 chinese toilets -> /toilet/
   177	 15 build a kernel -> /linux/linux-kernel.html
   178	 14 toilet world -> /toilet/
   179	 14 tektronix 2445 -> /radio/tek2445a.html
   180	 14 qemu linux usb -> /linux/qemu-unix.html
   181	 14 puppy linux qemu -> /linux/qemu-unix.html
   182	 14 programming cisco switches -> /networking/switch-programming.html
   183	 14 program cisco switch -> /networking/switch-programming.html
   184	 14 network security -> /cybersecurity/
   185	 14 linux kernel make -> /linux/linux-kernel.html
   186	 14 linux kernel building -> /linux/linux-kernel.html
   187	 14 linux ip information -> /networking/commands.html
   188	 14 linux hardening -> /cybersecurity/linux-hardening.html
   189	 14 international toilets -> /toilet/
   190	 14 how to build linux -> /linux/linux-kernel.html
   191	 14 greyhound bus toilet -> /toilet/bus.html
   192	 14 catalyst 2900 -> /networking/switch-programming.html
   193	 14 building linux -> /linux/linux-kernel.html
   194	 14 ben nevis trail -> /travel/uk/ben-nevis/
   195	 13 zepp antenna -> /radio/j-poles.html
   196	 13 unix tcp ip commands -> /networking/commands.html
   197	 13 unix ip configuration -> /networking/commands.html
   198	 13 tektronix oscilloscope -> /radio/tek2445a.html
   199	 13 qemu puppy -> /linux/qemu-unix.html
   200	 13 network security system -> /cybersecurity/
   201	 13 learn turkish grammar -> /turkish/background.html
   202	 13 kernel build howto -> /linux/linux-kernel.html
   203	 13 kata ton daimona eautou -> /travel/france/jim-morrison-paris.html
   204	 13 ip unix -> /networking/commands.html
   205	 13 interesting toilets -> /toilet/
   206	 13 how to program a cisco switch -> /networking/switch-programming.html
   207	 13 egyptian toilets -> /toilet/
   208	 13 building a kernel -> /linux/linux-kernel.html
   209	 13 brecourt manor -> /travel/france/normandy/brecourt-manor.html
   210	 12 would you like to enable as a cluster command switch -> /networking/switch-programming.html
   211	 12 unix firewall -> /cybersecurity/firewall.html
   212	 12 unix command ipconfig -> /networking/commands.html
   213	 12 toilets of the world -> /toilet/hightech.html
   214	 12 toilets in the world -> /toilet/
   215	 12 sniff tool -> /cybersecurity/monitoring.html
   216	 12 rose valley turkey -> /travel/turkey/goreme/
   217	 12 openbsd hardening -> /cybersecurity/linux-hardening.html
   218	 12 net.ipv4.conf.all.rp_filter=0 -> /cybersecurity/stack-hardening.html
   219	 12 making a kernel -> /linux/linux-kernel.html
   220	 12 list of suffixes -> /turkish/turkish-suffixes.html
   221	 12 linux ipconfig -> /networking/commands.html
   222	 12 linux ip info -> /networking/commands.html
   223	 12 kata ton jim morrison -> /travel/france/jim-morrison-paris.html
   224	 12 ip configuration in linux -> /networking/commands.html
   225	 12 ip config in linux -> /networking/commands.html
   226	 12 howto build linux kernel -> /linux/linux-kernel.html
   227	 12 how to calculate subnet number -> /networking/tcpip-subnetting.txt
   228	 12 firewall tools -> /cybersecurity/firewall.html
   229	 12 confutatis maledictis, flammis acribus addictis -> /fun/latin.html
   230	 12 calculate normal -> /3d/normals.html
   231	 12 255.254.0.0 -> /networking/
   232	 11 windows wireless sniffing -> /cybersecurity/monitoring.html
   233	 11 turkish language basics -> /turkish/background.html
   234	 11 toilet signage -> /toilet/signage.html
   235	 11 tcp/ip commands -> /networking/commands.html
   236	 11 tcp ip unix -> /networking/commands.html
   237	 11 sit vis tecum -> /fun/latin.html
   238	 11 russian grammar table -> /russian/grammar.html
   239	 11 rtsp internet radio -> /radio/internet-radio.html
   240	 11 network security audit tools -> /cybersecurity/netaudit.html
   241	 11 monitoring lan -> /cybersecurity/monitoring.html
   242	 11 ip configuration linux -> /networking/commands.html
   243	 11 history of information security -> /cybersecurity/history/
   244	 11 hiking hadrian's wall -> /travel/uk/hadrians-wall/
   245	 11 french toilet -> /toilet/france.html
   246	 11 foreign toilets -> /toilet/
   247	 11 dover tunnels -> /travel/uk/dover/
   248	 11 convert pal to ntsc dvd -> /technical/pal-to-ntsc.html
   249	 11 computer forensic tools free -> /cybersecurity/forensics.html
   250	 11 cisco catalyst 2900 xl -> /networking/switch-programming.html
   251	 11 cisco 2900 -> /networking/switch-programming.html
   252	 11 build kernel from source -> /linux/linux-kernel.html
   253	 11 brecourt manor normandy -> /travel/france/normandy/brecourt-manor.html
   254	 11 bob cromwell -> /
   255	 11 authentication tools -> /cybersecurity/authentication.html
   256	 11 african toilets -> /toilet/north-africa.html
   257	 11 55 central park west ghostbusters -> /travel/usa/ghostbusters/
   258	 10 zepp antenna calculator -> /radio/j-poles.html
   259	 10 unix display ip -> /networking/commands.html
   260	 10 turkish verb conjugation -> /turkish/verbs.html
   261	 10 trains in turkey -> /travel/turkey/trains/
   262	 10 tcp/ip -> /networking/
   263	 10 tcp ip commands -> /networking/commands.html
   264	 10 stupid signs -> /fun/strange-signs.html
   265	 10 squatting toilet platform -> /toilet/install.html
   266	 10 sniff wireless lan -> /cybersecurity/monitoring.html
   267	 10 pki tools -> /cybersecurity/pki.html
   268	 10 pearl's place tobago -> /travel/trinidad/
   269	 10 lan sniffing -> /cybersecurity/monitoring.html
   270	 10 italian toilets -> /toilet/italy.html
   271	 10 ip information linux -> /networking/commands.html
   272	 10 ic229h -> /radio/ic229.html
   273	 10 ic-229h -> /radio/ic229.html
   274	 10 how to brew mead -> /brewing/
   275	 10 hotel medicis paris -> /travel/france/jim-morrison-paris.html
   276	 10 ghostbusters columbia university -> /travel/usa/ghostbusters/
   277	 10 configure catalyst 2900 xl -> /networking/switch-programming.html
   278	 10 config ip linux -> /networking/commands.html
   279	 10 bidet -> /toilet/bidet.html
   280	 10 255.255.255.254 -> /networking/

Unix is powerful, the Internet is strange.

Where next?