September16
Most of the Debian system has the below dictionary file ( which is the pure ASCII words )
/usr/share/dict/american-english
we have a built-in variable called RANDOM in bash and ksh shells. Using that, we can print random words from the above given dictionary file.
example of RANDOM variable
1
2
3
4
| $ echo $RANDOM
30728
$ echo $RANDOM
24228 |
$ echo $RANDOM
30728
$ echo $RANDOM
24228
Using the below code, we can print some random word from the dictionary file.
1
2
3
4
5
6
7
8
9
10
| $ awk -v lineno="$RANDOM" 'lineno==NR{print;exit}' /usr/share/dict/american-english
Jeannie's
$ awk -v lineno="$RANDOM" 'lineno==NR{print;exit}' /usr/share/dict/american-english
authorization
$ awk -v lineno="$RANDOM" 'lineno==NR{print;exit}' /usr/share/dict/american-english
Yiddish's
$ awk -v lineno="$RANDOM" 'lineno==NR{print;exit}' /usr/share/dict/american-english
Constantine's
$ awk -v lineno="$RANDOM" 'lineno==NR{print;exit}' /usr/share/dict/american-english
Miro |
$ awk -v lineno="$RANDOM" 'lineno==NR{print;exit}' /usr/share/dict/american-english
Jeannie's
$ awk -v lineno="$RANDOM" 'lineno==NR{print;exit}' /usr/share/dict/american-english
authorization
$ awk -v lineno="$RANDOM" 'lineno==NR{print;exit}' /usr/share/dict/american-english
Yiddish's
$ awk -v lineno="$RANDOM" 'lineno==NR{print;exit}' /usr/share/dict/american-english
Constantine's
$ awk -v lineno="$RANDOM" 'lineno==NR{print;exit}' /usr/share/dict/american-english
Miro
In the above awk command, lineno is a variable which holds the RANDOM number, then we are comparing with processing line number of awk. If both number matches, we are printing that word.
exit is used to avoid processing/reading the remaining lines.
September15
The below one liner is used to show the most commonly commands and its count.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| $ history | awk '{a[$2]++;next}END{for (i in a){print i " --> " a[i]}}' | sort -nr -k3
clear --> 25
cal --> 23
history --> 9
./caldate.sh --> 7
date --> 6
ls --> 2
cd --> 2
pwd --> 1
ps --> 1
man --> 1
env --> 1
echo|awk --> 1
echo --> 1
chmod --> 1
cat --> 1
awk --> 1 |
$ history | awk '{a[$2]++;next}END{for (i in a){print i " --> " a[i]}}' | sort -nr -k3
clear --> 25
cal --> 23
history --> 9
./caldate.sh --> 7
date --> 6
ls --> 2
cd --> 2
pwd --> 1
ps --> 1
man --> 1
env --> 1
echo|awk --> 1
echo --> 1
chmod --> 1
cat --> 1
awk --> 1
September12
In unix/linux we have a utility called nslookup. Which is very useful to query internet naming servers.
Man Page for nslookup
1) Lets see how to retrieve the ip address from the URL ( eg. www.google.com )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| $ nslookup www.google.com
Server: 218.186.2.16
Address: 218.186.2.16#53
Non-authoritative answer:
Name: www.google.com
Address: 173.194.38.147
Name: www.google.com
Address: 173.194.38.146
Name: www.google.com
Address: 173.194.38.145
Name: www.google.com
Address: 173.194.38.144
Name: www.google.com
Address: 173.194.38.148 |
$ nslookup www.google.com
Server: 218.186.2.16
Address: 218.186.2.16#53
Non-authoritative answer:
Name: www.google.com
Address: 173.194.38.147
Name: www.google.com
Address: 173.194.38.146
Name: www.google.com
Address: 173.194.38.145
Name: www.google.com
Address: 173.194.38.144
Name: www.google.com
Address: 173.194.38.148
If you want only the ip address, then you can awk the output of the nslookup output.
1
2
3
4
5
6
7
8
9
| $ nslookup www.google.com | awk '/Address/&&!/#/'
Address: 173.194.38.176
Address: 173.194.38.179
Address: 173.194.38.180
Address: 173.194.38.178
Address: 173.194.38.177
$ nslookup www.facebook.com | awk '/Address/&&!/#/'
Address: 66.220.149.94 |
$ nslookup www.google.com | awk '/Address/&&!/#/'
Address: 173.194.38.176
Address: 173.194.38.179
Address: 173.194.38.180
Address: 173.194.38.178
Address: 173.194.38.177
$ nslookup www.facebook.com | awk '/Address/&&!/#/'
Address: 66.220.149.94
If you type the above ip addresses, then you will be directed to corresponding website.
August8
Find Weather using perl script Weather::Google
1) Install the Weather::Google using the Synaptic Package Manager (in Ubuntu)
2) copy paste the below code and save it as googleweather.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| #!/usr/bin/perl
use Weather::Google;
# If you plan on using locations with non-ASCII characters
use encoding 'utf8';
my $gw;
## Initialize the module
$gw = new Weather::Google('Singapore'); # City name
## Get some current information
my @info;
@info = $gw->current('temp_f','temp_c','humidity','wind_condition');
## Forecast
print "Today's high: ", $gw->forecast(0,'high'),"\n";
print "Today's low: ", $gw->forecast(0,'low'),"\n";
## Forecast information:
my $info = $gw->forecast_information;
print "Zip: " . $info->{postal_code}."\n";
3) Execute the code using perl googleweather.pl |
#!/usr/bin/perl
use Weather::Google;
# If you plan on using locations with non-ASCII characters
use encoding 'utf8';
my $gw;
## Initialize the module
$gw = new Weather::Google('Singapore'); # City name
## Get some current information
my @info;
@info = $gw->current('temp_f','temp_c','humidity','wind_condition');
## Forecast
print "Today's high: ", $gw->forecast(0,'high'),"\n";
print "Today's low: ", $gw->forecast(0,'low'),"\n";
## Forecast information:
my $info = $gw->forecast_information;
print "Zip: " . $info->{postal_code}."\n";
3) Execute the code using perl googleweather.pl
1
2
3
4
| $ perl googleweather.pl
Today's high: 90
Today's low: 77
Zip: Singapore |
$ perl googleweather.pl
Today's high: 90
Today's low: 77
Zip: Singapore
If you want to install the package in windows then issue the below command in command prompt
1
| ppm install Weather-Google |
ppm install Weather-Google
August7
Rename the files using perl
we can use the method rename for renaming the files using perl script.
1
2
3
4
5
6
7
8
9
10
11
| $ cat rename.pl
#!/usr/bin/perl
use strict;
use warnings;
foreach $_ (@ARGV) {
my $oldfile = $_;
s/.bk//g;
rename($oldfile, $_);
} |
$ cat rename.pl
#!/usr/bin/perl
use strict;
use warnings;
foreach $_ (@ARGV) {
my $oldfile = $_;
s/.bk//g;
rename($oldfile, $_);
}
Now i am creating some .bk files using the touch command
1
2
3
| $ touch a.txt.bk
$ touch b.txt.bk
$ touch c.txt.bk |
$ touch a.txt.bk
$ touch b.txt.bk
$ touch c.txt.bk
Now i have 3 .bk files in my current directory.
1
2
3
4
5
6
| $ ls -lrt
total 4
-rw-rw-r-- 1 kamaraj kamaraj 126 Aug 7 23:38 rename.pl
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 a.txt.bk
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 b.txt.bk
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 c.txt.bk |
$ ls -lrt
total 4
-rw-rw-r-- 1 kamaraj kamaraj 126 Aug 7 23:38 rename.pl
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 a.txt.bk
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 b.txt.bk
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 c.txt.bk
execute the perl file as below.
Now you can see all the files are named ( .bk was removed )
1
2
3
4
5
6
| $ ls -lrt
total 4
-rw-rw-r-- 1 kamaraj kamaraj 126 Aug 7 23:38 rename.pl
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 a.txt
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 b.txt
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 c.txt |
$ ls -lrt
total 4
-rw-rw-r-- 1 kamaraj kamaraj 126 Aug 7 23:38 rename.pl
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 a.txt
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 b.txt
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 c.txt
If i want to revert back the filenames to .bk format, then you can use the below one-liner
1
2
3
4
5
6
7
8
| $ ls *.txt | perl -lane '$origname=$_;s/.txt/.txt.bk/;rename($origname,$_)'
$ ls -lrt
total 4
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 a.txt.bk
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 b.txt.bk
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 c.txt.bk
-rw-rw-r-- 1 kamaraj kamaraj 126 Aug 7 23:42 rename.pl |
$ ls *.txt | perl -lane '$origname=$_;s/.txt/.txt.bk/;rename($origname,$_)'
$ ls -lrt
total 4
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 a.txt.bk
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 b.txt.bk
-rw-rw-r-- 1 kamaraj kamaraj 0 Aug 7 23:38 c.txt.bk
-rw-rw-r-- 1 kamaraj kamaraj 126 Aug 7 23:42 rename.pl
Using the below for loop, we can easily rename the .txt.bk files to .txt files
1
| for i in *.bk; do echo "mv ${i} ${i/.bk/}"; done |
for i in *.bk; do echo "mv ${i} ${i/.bk/}"; done
June25
In most of the linux flavors, you will be having a command called ‘stat’
Using the stat command, we can easily retrieve the permission of a file in octal representation
1
| stat -c '%a' filename.txt |
stat -c '%a' filename.txt
Octal digit |
Text equivalent |
Binary value |
Meaning |
0 |
--- |
000 |
All types of access are denied |
1 |
--x |
001 |
Execute access is allowed only |
2 |
-w- |
010 |
Write access is allowed only |
3 |
-wx |
011 |
Write and execute access are allowed |
4 |
r-- |
100 |
Read access is allowed only |
5 |
r-x |
101 |
Read and execute access are allowed |
6 |
rw- |
110 |
Read and write access are allowed |
7 |
rwx |
111 |
Everything is allowed |
we can write a awk function to calculate the permission in octal representation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| $cat permission.awk
function cal(str)
{
a=0;
if(str~/r/)
{
a+=4;
}
if(str~/w/)
{
a+=2;
}
if(str~/x/)
{
a+=1;
}
}
{
for(i=2;<=length($1);i=i+3)
{
cal(substr($1,i,3))
octal=octal""a;
}
print octal
} |
$cat permission.awk
function cal(str)
{
a=0;
if(str~/r/)
{
a+=4;
}
if(str~/w/)
{
a+=2;
}
if(str~/x/)
{
a+=1;
}
}
{
for(i=2;<=length($1);i=i+3)
{
cal(substr($1,i,3))
octal=octal""a;
}
print octal
}
1
2
3
4
5
6
7
8
9
10
11
| $ chmod 000 a.txt
$ ls -l a.txt | awk -f permission.awk
000
$ chmod 001 a.txt
$ ls -l a.txt | awk -f permission.awk
001
$ chmod 031 a.txt
$ ls -l a.txt | awk -f permission.awk
031 |
$ chmod 000 a.txt
$ ls -l a.txt | awk -f permission.awk
000
$ chmod 001 a.txt
$ ls -l a.txt | awk -f permission.awk
001
$ chmod 031 a.txt
$ ls -l a.txt | awk -f permission.awk
031
One more function from ctsgnb
1
2
3
4
5
6
7
8
9
10
11
12
13
| #!/bin/bash
function conv_perm(){
binary1=`echo "$1" | cut -c4,7,10|tr xstST- 011110`
binary2=`echo "$1" | cut -c2-10 | tr rwsxtST- 11111000`
octal=`echo "obase=8;ibase=2;${binary1}${binary2}"|bc`
echo "$octal"
}
#Call the function
conv_perm "-rwxrwxrwx"
conv_perm "-r-x-wx-wx"
conv_perm "-r-x--x-w-" |
#!/bin/bash
function conv_perm(){
binary1=`echo "$1" | cut -c4,7,10|tr xstST- 011110`
binary2=`echo "$1" | cut -c2-10 | tr rwsxtST- 11111000`
octal=`echo "obase=8;ibase=2;${binary1}${binary2}"|bc`
echo "$octal"
}
#Call the function
conv_perm "-rwxrwxrwx"
conv_perm "-r-x-wx-wx"
conv_perm "-r-x--x-w-"
June19
Scramble Word Finder – Shell Script
Most of the Debian system has the below dictionary file ( which is the pure ASCII words )
/usr/share/dict/american-english
Now sort each string by character wise and store it in seperate file called words_sorted.txt
1
| perl -lane '@chars=split(//,$_); printf("%s%25s\n",$_,lc join (/,/, sort @chars));' /usr/share/dict/american-english > words_sorted.txt |
perl -lane '@chars=split(//,$_); printf("%s%25s\n",$_,lc join (/,/, sort @chars));' /usr/share/dict/american-english > words_sorted.txt
Now all the words are sorted and the original word is in first column and the sorted value is in second column.
1
2
3
4
5
6
7
8
9
10
11
| $ head words_sorted.txt
A a
A's 'as
AOL alo
AOL's 'alos
Aachen aacehn
Aachen's 'aacehns
Aaliyah aaahily
Aaliyah's 'aaahilsy
Aaron aanor |
$ head words_sorted.txt
A a
A's 'as
AOL alo
AOL's 'alos
Aachen aacehn
Aachen's 'aacehns
Aaliyah aaahily
Aaliyah's 'aaahilsy
Aaron aanor
Now write a script to find the scramble words.
Save the below script as scramble.sh
1
2
3
4
5
6
7
8
9
10
11
12
| #!/bin/bash
echo -n "Enter the Scrambled Word : "
read word
#sort the characters within the word
sorted_word=$(echo "$word" | grep -o . | sort |tr -d "\n")
matched_words=$(awk -v word="$sorted_word" '{if($2~word && length($2) == length(word)){print $1}}' words_sorted.txt)
echo "Given Input : $word"
echo "The Matched words are : $matched_words" |
#!/bin/bash
echo -n "Enter the Scrambled Word : "
read word
#sort the characters within the word
sorted_word=$(echo "$word" | grep -o . | sort |tr -d "\n")
matched_words=$(awk -v word="$sorted_word" '{if($2~word && length($2) == length(word)){print $1}}' words_sorted.txt)
echo "Given Input : $word"
echo "The Matched words are : $matched_words"
Now the run the script and check the output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| $ ./scramble.sh
Enter the Scrambled Word : tleeivisno
Given Input : tleeivisno
The Matched words are : television
$ ./scramble.sh
Enter the Scrambled Word : ifnd
Given Input : ifnd
The Matched words are : find
$ ./scramble.sh
Enter the Scrambled Word : srbcalme
Given Input : srbcalme
The Matched words are : clambers
scramble |
$ ./scramble.sh
Enter the Scrambled Word : tleeivisno
Given Input : tleeivisno
The Matched words are : television
$ ./scramble.sh
Enter the Scrambled Word : ifnd
Given Input : ifnd
The Matched words are : find
$ ./scramble.sh
Enter the Scrambled Word : srbcalme
Given Input : srbcalme
The Matched words are : clambers
scramble
How to solve the Crossword Puzzle ?
Here is the script
https://www.thelinuxtips.com/2010/12/solve-the-crossword-puzzle/
June18
thelinuxtips.com – Linux Commands Manual Page
man is the system’s manual pager. Each page argument given to man is normally the name of a program, utility or function. The manual page associated with each of these arguments is then found and displayed. A section, if provided, will direct man to look only in that section of the manual. The default action is to search in all of the available sections, following a pre-defined order and to show only the first page found, even if page exists in several sections.
The UNIX Programmer’s Manual was first published on November 3, 1971. The first actual man pages were written by Dennis Ritchie and Ken Thompson at the insistence of Doug McIlroy in 1971. The troff macros used for man pages (-mm) were the general-purpose ones written by Ted Dolotta (later to be the first manager of USG and the principal author of the System III manual), with additions for the manuals. At the time, the availability of online documentation through the manual page system was regarded as a great advance. To this day, virtually every Unix command line application comes with its man page, and many Unix users perceive a lack of man pages as a sign of low quality; indeed, some projects, such as Debian, go out of their way to write man pages for programs lacking one.
More…
I extracted all the man pages and hosted in this website for your reference.
https://www.thelinuxtips.com/Man/
June7
The following script is used to ping multiple hosts.
#!/bin/bash
for i in 192.168.0.{1..10}
do
ping -c 1 -t 1 "$i" >/dev/null 2>&1 &&
echo "Ping Status of $i : Success" ||
echo "Ping Status of $i : Failed"
done |
#!/bin/bash
for i in 192.168.0.{1..10}
do
ping -c 1 -t 1 "$i" >/dev/null 2>&1 &&
echo "Ping Status of $i : Success" ||
echo "Ping Status of $i : Failed"
done
Suppose, if we have more host names in the text file, then we can use the below script.
1
2
3
4
5
6
| while read hostname
do
ping -c 1 -t 1 "$hostname" > /dev/null 2>&1 &&
echo "Ping Status of $hostname : Success" ||
echo "Ping Status of $hostname : Failed"
done < host.txt |
while read hostname
do
ping -c 1 -t 1 "$hostname" > /dev/null 2>&1 &&
echo "Ping Status of $hostname : Success" ||
echo "Ping Status of $hostname : Failed"
done < host.txt
June4
What is Tower of Hanoi ?
The objective of the puzzle is to move the entire stack to another rod, obeying the following rules:
- Only one disk may be moved at a time.
- Each move consists of taking the upper disk from one of the rods and sliding it onto another rod, on top of the other disks that may already be present on that rod.
- No disk may be placed on top of a smaller disk.
With three disks, the puzzle can be solved in seven moves.
More information about the Tower of Hanoi
Shell script for this puzzle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| $ cat hanoi.sh
#!/bin/bash
#---------------------------------------
#Author : Kamaraj Subramanian
#---------------------------------------
echo -n "How Many Disks? : "
read disk
echo "-------------STARTS---------"
for (( x=1; x < (1 << $disk ); x++ ))
do
i=$((($x & $x - 1 ) % 3))
j=$(((($x | $x - 1 ) + 1 ) % 3))
echo "Move from tower $i to tower $j"
done |
$ cat hanoi.sh
#!/bin/bash
#---------------------------------------
#Author : Kamaraj Subramanian
#---------------------------------------
echo -n "How Many Disks? : "
read disk
echo "-------------STARTS---------"
for (( x=1; x < (1 << $disk ); x++ ))
do
i=$((($x & $x - 1 ) % 3))
j=$(((($x | $x - 1 ) + 1 ) % 3))
echo "Move from tower $i to tower $j"
done
Solution :
1
2
3
4
5
6
7
8
9
10
| $ ./hanoi.sh
How Many Disks? : 3
-------------STARTS---------
Move from tower 0 to tower 2
Move from tower 0 to tower 1
Move from tower 2 to tower 1
Move from tower 0 to tower 2
Move from tower 1 to tower 0
Move from tower 1 to tower 2
Move from tower 0 to tower 2 |
$ ./hanoi.sh
How Many Disks? : 3
-------------STARTS---------
Move from tower 0 to tower 2
Move from tower 0 to tower 1
Move from tower 2 to tower 1
Move from tower 0 to tower 2
Move from tower 1 to tower 0
Move from tower 1 to tower 2
Move from tower 0 to tower 2
Recent Comments