Skrypty w powłoce BASH z wykorzystaniem polecenia AWK
Transkrypt
Skrypty w powłoce BASH z wykorzystaniem polecenia AWK
Skrypty w powłoce BASH z wykorzystaniem polecenia AWK
Skrypt nr 1
Dla zadanego pliku tekstowego wylistować plik w ten sposób, że każde zdanie jest w jednej linii.
#!/bin/sh
if [ "$#" != 1 ]; then
echo "Skrypt uruchamiany z jednym parametrem"
exit 1
fi
if [ ! -f $1 ]; then
echo "Nie znaleziono pliku"
exit 2
fi
awk ’BEGIN{ RS="[.?!]" }; { gsub(/[\n]/," "); gsub(/^ /,"");
gsub(/( )/," "); printf("%s%s\n",$0,RT) }’ $1
Skrypt nr 2
Na wejściu dostajemy strumień ścieżek np. wygenerowany przez ”find -type l -printf ”%l\n””, przetwarzanie polega na wyświetlaniu
linków w ten sposób, że jeżeli link jest bezwzględny to wyświetlamy b:link, jeżeli względny to należy usunąć początkowe kropki i 2
kropki (slash też), zamiast tego wyświetlamy: UPn:ścieżka od normalnego katalogu, n -ile razy mamy pójść ”do góry”.
#!/bin/sh
if [ "$#" != 1 ]; then
echo "Skrypt uruchamiany z jednym parametrem"
exit 1
fi
if [ ! -d $1 ]; then
echo "Nie znaleziono katalogu docelowego"
exit 2
fi
find -type l -printf "%l\n" | awk ’BEGIN { FS="/"; OFS="/" };
/^[/]/ { printf "b:%s\n", $0 }
/^[.]/ {
x=0
for(i=1; $i=="."||$i=="..";i++)
{
if($i=="..")
{x++}
$i=""
}
gsub(/^[/]+/,"",$0); printf "UP%i:%s\n", x, $0 }’
Skrypt nr 3
Wylistować dowiązania z drzewa katalogów ze zmienionymi ścieżkami ze względnych na bezwzględne.
#!/bin/sh
if [ "$#" != 1 ]; then
echo "Skrypt uruchamiany z jednym parametrem"
exit 1
fi
if [ ! -d $1 ]; then
echo "Nie znaleziono katalogu docelowego"
exit 2
fi
gdzie=‘pwd‘
# do zmiennej wpisuje ścieżkę do katalogu
find $gdzie -type l -printf %l\\t%h\\n | awk ’
{
if(match($1,/^[^/]/)==1)
{
print $2"/"$1
}
}’
Skrypt nr 4
W zadanym drzewie katalogow znalezc pliki regularne, w ktorych nazwie nie ma czlonow, ktore wystepowalyby jako czlony w
nazwach dowolnego nadkatalogu w drzewie. Czlony nie sa rozdzielane litera ani cyfra.
#!/bin/sh
if [ "$#" != 1 ]; then
echo "Zla liczba parametrow"
exit 1
fi
if [ ! -d $1 ]; then
echo "Podany katalog nie istnieje"
exit 2
fi
find $1 -type f | awk ’BEGIN { FS="[^a-zA-Z0-9]" } { nazwa=gensub(/.+?\//, "",1) }
{ liczba=gsub(/[^a-zA-Z0-9]/,".",nazwa); NF=NF-liczba-1; check=0 }
{ for (i=1; i<=NF; i++)
{
tab[$i]++
}
}
{ for (j in tab)
{
if (match(nazwa, j))
{ check=1 }
}
}
{ if (check==0) { print nazwa } }
{ delete tab }’
Skrypt nr 5
W zadanym pliku zawierającym język C zaznaczyć (odpowiednim komentarzem po nawiasie) wszystkie początki i końce bloków o
zerowym zagnieżdżeniu.
#!/bin/bash
if [ $# != 1 ]; then
echo "Podano zla ilosc argumentow!"
exit 1
fi
if [ ! -f $1 ]; then
echo "Argument nie jest plikiem!"
exit 2
fi
cat $1 | awk ’BEGIN { FS="}"; OFS="}"; RS="{"; ORS="{" }; NF>1
{ if(match($0,"}"))
{ print "// brak zagniezdzen!\n " gensub(/}/,"}//brak zagniezdzen!",1,$0) > "test.cpp" }
}
NF < 2 { print $0 > "test.cpp" }’
Skrypt nr 6
W zadanym drzewie katalogów znaleźć dowiązanie symboliczne, w którym ostatni człon zawiera w nazwie nazwę pliku.
#!/bin/sh
if [ $# != 1 ]; then
echo "Zla ilosc parametrow."
exit 1
fi
if [ ! -d $1 ]; then
echo "$1 nie jest katalogiem"
exit 2
fi
k=""
find $1 -type l -printf %l\\t%f\\n | awk ’{
gsub("\/+.*\/","",$1) # obcina sciezke, pozostawiajac tylko nazwe dowiazania
if(match($2,".*" $1 ".*"))
{
print "plik: " $1 "\tdowiazanie: " $2;
} }’
2
Skrypt nr 7
W drzewie katalogów zmienić nazwy plików regularnych na nazwy z samymi małymi literami. W przypadku konfliktu nazw dodać
jako pierwsze rozszerzenie kolejną liczbę naturalną.
#!/bin/sh
if [ ! $# -eq 1 ]; then
echo "Podaj tylko jeden parametr"
exit 1
fi
if [ ! -d $1 ]; then
echo "Podaj nazwe katalogu"
exit 2
fi
find $1 -type f -printf %f\\n | awk ’ {
if ($1 != tolower($1))
{
print $1 " " tolower($1)
} }’ | while read st new
do
i=1
if [ -e $1/$new ]; then
tmp=${new%%.*}
tmp2=${new#*.}
mv $1/$st $1/${tmp}.$i.${tmp2}
else
mv $1/$st $1/$new
fi
done
Skrypt nr 8
W zadanym pliku zawierającym tekst formatowany przez zaznaczanie nowych akapitów co najmniej dwoma nowymi liniami dokonać
transformacji tak aby akapity wewnątrz nie zawieraly nowych linii, a były rozdzielone pojedynczą nową linią.
#!/bin/sh
if [ "$#" != 1 ]; then
echo "Zla liczba argumentow!"
exit 1
fi
if [ ! -f $1 ];
echo "Plik nie istnieje!"
exit 2
fi
napis=" "
awk ’BEGIN { RS="\n\n+"; FS="\n" };
{
for(i=1; i<NF+1; i++)
{
if ($i !~ /[[:blank:]]$/)
{
$i=sprintf("%s ",$i)
}
napis=sprintf("%s%s",napis,$i)
}
print napis
napis=""
}’ $1
# separatorem rekordow sa co najmniej dwie nowe linie
# separatorem pol jest pojedynczy znak nowej linii
# jesli dane pole nie konczy sie spacja zostaje o nia uzupelnione
# tak by nie skleic wyrazow przy likwidowaniu znaku nowej linii
# dodawanie znaku spacji
# laczenie wszystkich pol rekordu w jeden string
# zerowanie napisu (potrzebne aby poprawnie obsluzyc kolejny rekord)
3