Wednesday, January 14, 2015

Bash - Find substring in a string

Very simple solution to find substring in a string, make script sub.sh:
#!/bin/bash
txt="This is a text"
substr="text"
if [[ $txt == *$substr* ]]
then
echo "String [$txt] contains substring [$substr]"
else
echo "String [$txt] doesn't contains substring [$substr]"
fi

Variable txt is a string which should (or not) contains string from variable substr.

Output:
$ ./sub.sh
String [This is a text] contains substring [text]

Change variable substr:
substr="t1xt"

Output:
$ ./sub.sh
String [This is a text] doesn't contains substring [t1xt]

Tuesday, January 13, 2015

Linux - Search for empty directories and files

To search for empty directories type:
$ find . -empty -type d
To delete empty directories:
$ find . -empty -type d -delete

If enter -type f instead of -type d, this command will search for empty files:
$ find . -empty -type f
to delete empty files:
$ find . -empty -type f -delete

Monday, January 12, 2015

Bash Script: Number of Arguments

Number of arguments is in variable $#, example is script numarg.sh

#!/bin/bash
echo "number of arguments: $#"

Executing script: 
$ ./numarg.sh arg1 arg2 arg3
Number of arguments: 3

Variable $# doesn't count script name, only arguments.

Arguments are stored in variables $1, $2... or in $@ as array.


Thursday, January 8, 2015

[Bash] Count Letters in a Text File

Bash script have very useful commands for Text File analysis. For this example we will use small part from Leo Tolstoy: War and Peace, available on Project Gutenberg:




This part is placed in file onepart.txt. To count letters all letters must have same case. Command tr will translate all letters to uppercase letters:
$ cat onepart.txt|tr a-z A-Z
Next, output is filtered. Command tr is useful here with first argument are switches -cd and seccond is letter to be filtered. Switch -c means complent and -d to delete, in short those two arguments means erase everything what is not letter in argument.
Pipelining we get:
$ cat onepart.txt|tr a-z A-Z|tr -cd A
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
Or for B, C etc...

$ cat 3.txt|tr a-z A-Z|tr -cd B
BBBB

$ cat 3.txt|tr a-z A-Z|tr -cd C
CCCCCCCCCCCCCCCCCCCCCCC

 $ cat 3.txt|tr a-z A-Z|tr -cd D
DDDDDDDDDDDDDDDDDDDDDDDDDD

And of course we need to count those letters. Command wc with switch -m do exactly that:

$ cat 3.txt|tr a-z A-Z|tr -cd A|wc -m
40

$ cat 3.txt|tr a-z A-Z|tr -cd B|wc -m
4

$ cat 3.txt|tr a-z A-Z|tr -cd C|wc -m
23

$ cat 3.txt|tr a-z A-Z|tr -cd D|wc -m
26
and, of course, script to count all letters occurances: 

#!/bin/bash

text=$(cat $1|tr a-z A-Z)
echo "Letter occurances:"

for l in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do 
let=$(echo $text|tr -cd $l|wc -m)
echo "$l $let"
done
Script is a little bit slower because text is analyzed for every letter.