Warning: main(./../../../common/menutop.html) [function.main]: failed to open stream: No such file or directory in /mnt/129/sdb/8/f/gadille/doc/scripting/bash/bash.php on line 15

Warning: main() [function.include]: Failed opening './../../../common/menutop.html' for inclusion (include_path='/mnt/129/sdb/8/f/gadille/include:.:/usr/php4/lib/php') in /mnt/129/sdb/8/f/gadille/doc/scripting/bash/bash.php on line 15
Tutoriel BASH

Bash

one line

ls toto | xargs -n 1 cat
On utilise la sortie standard precedante come argument du cat
find | grep "~" | xargs -n 1 rm
On va effacer tous les fichier touver par find contnant un ~
ssh lionel@antec cat /opt/toto.xml |diff /opt/toto.xml -
L'usage du moins permet d'utiliser le le fux standard en entré du diff
vmstat | grep -v procs|grep -v r| tr -s ' '|cut -d " " -f 14
grep -v (select inversse)
tr -s' ' suprime les espaces en doublon tr -d ' ' tous les espace
ps -edf | grep wget | tr -s ' '| cut -d" " -f 2 | xargs -n 1 kill -9
kill -9 des process selectionné dans le grep
cat encode.txt | tr -s ' ' | tr -d '\011' | tr ' ' '=' > tmp
on garde 1 seul espace on vire les tab puis on rempalce les espace par des egales
gunzip -dc /opt/logs/pushCostRevenue-uk-2010-12-07.tsv.gz |awk -F"@" 'length($6)>40 {print length($6) " " $6}'
affiche le champ 6 si celui si a plus de 40 char (-F indique le changement du separateur par default)
date +%m --date='-10 day' | awk '{sub (/^0/,"")};1'
affiche le mois d'il ya 10 jours et suprime le zero du debut
grep -RH InetAddress .|grep -v target|cut -d":" -f 1|sort|uniq
recherche dans le code InetAddress et n'afiche que 1 fois chaque class le contenant
sed -i 's/lio gad/lionel gadille/g' *.html
Remplace dans tous les fichier *.html lio gad par lionel gadille
grep -RH \!password * | cut -d : -f 1 | xargs sed -i "s/\!password/gadille/g"
Cherche !passowrd dans tous les soudir, recupére l'info du fichier le conteant et le passe a sed pour effectuer un remplacement
cat listeSalles|cut -d":" -f1| awk '{sub("","image");print}' | awk '{sub("$",".pdf");print}'
rajoute en debut de listeSalle image et pdf en fin
find . -name "*.html" | xargs perl -pi -e 's/href="\/css/href="\/common\/css/'
remplace dans tous les fichier html href="/css/ par href="/common/css
cat frompost | tr "&" "\n" > frompost2 remplace dans tous le fichier & par \n (retour ligne)
sshResult=`ssh root@ensinet 'grep "^Apr 23" /nsr/logs/messages|grep "Failed:\|Succeeded: \| Succeeded with warning(s):"'` echo "$sshResult" effectue un grep sur un serveur avec des ou et stock le tosu dans uen vare resultat

arg

$0Contient le nom du script tel qu'il a été invoqué
$*L'ensembles des paramètres sous la forme d'un seul argument
$@L'ensemble des arguments, un argument par paramètre
$#Le nombre de paramètres passés au script
$?Le code retour de la dernière commande
$$Le PID du shell qui exécute le script
$!Le PID du dernier processus lancé en arrière-plan

exemples

Cacti

#!/bin/bash set -e # exit a la première erreur (code retour diff de zero)
function help(){ echo "Passer en argument le nom du serveur Ade à tester" echo "exemple: ./dist-loadavg.sh hostname" exit 3 } if [ -z "$1" ] #test que $1 est non vide then help fi if [ $# -ne 1 ];then #test si il y 'a bien que 1 arg help fi ssh sinfo@$1 "perl ~/monitoring/loadavg_multi.pl" exit 0
Plusieurs point de base sont intéressant
function help() Une fonction qui doit etre ecrite avant le corps du script
if [ -z "$1" ] Si l'argument s1 est vide (string vide)
if [ $# -ne 1 ] Si le nbr d'arg est diff de 1

Nagios

#!/bin/bash # nagios plugin vérifiant que le service web ADE est ok set -e # exist a la premiére erreur (code retour diff de zero) if [ -n "$1" ] then host=$1 protocol="http://" url=$protocol$host"/ade/custom/modules/plannings/direct_planning.jsp?projectId=106&login=xxxx&password=xxxx&resources=819&days=0,1,2,3,4&displayConfId=5" #echo "host:${host} url:${url}" #on save le resulta de la requette vers ade.html wget -O /tmp/ade.html "${url}" >/dev/null 2>&1 test="/ade/standard/gui/tree.jsp?forceLoad=false&isDirect=true" if grep -q ${test} /tmp/ade.html then echo "Ade ok : chaine de test localisé" exit 0 else echo "Ade ko:Erreur chaine de test non localisé" exit 2 fi else echo "Passer en argument le nom du serveur Ade à tester" echo "exemple: ./Ensimag-ade-web.sh xxx.fr" exit 3 fi exit 0
exit N Nagios et d'autre script se base sur les code retour pour déterminer l'état de la sonde il faut donc renseigner l'etat de sortie du script
1 --> ok(vert))
2 --> erreur erreur détecté (rouge)
3 --> etat inconnue (jaune)

For

Ecriture en plusieur ligne:
for i in `seq -w 2 20`;do echo toto $i done
affiche :
toto 2
toto 3
...
toto 20

Idem en une ligne:
for i in `seq -w 2 20`;do echo toto $i; done for i in *.del; do FN=$(echo $i | cut -d. -f 1 ); echo "$i $FN.ixf"; done | xargs -n 2 mv
cut -d. -f1 -d=delimiter -f=field
xargs -n 2 = reinject 2 argument dans le mv

Java c style:
for((i=1;i<=20;i=i+1)); do echo toto $i; done for((i=1;i<=20;i=i+1)); do cp 0ro20/* 0ro2$i; done for((i=1;i<=20;i=i+1)); do mkdir 0ro2$i;cp 0ro20/* 0ro2$i ; done
cut deux parenthese obligatoire

If

Arithmetic Comparison
-lt
<
-gt
>
-le
<=
-ge
>=
-eq
==
-ne
!=

String Comparisons
=
equal
 !=
not equal
<
less then
>
greater then
-n s1
string s1 is not empty
-z s1
string s1 is empty

Bash File Testing
-b
filename Block special file
-c
filename Special character file
-d
directoryname Check for directory existence
-e
filename Check for file existence
-f
filename Check for regular file existence not a directory
-G
filename Check if file exists and is owned by effective group ID.
-g
filename true if file exists and is set-group-id.
-k
filename Sticky bit
-L
filename Symbolic link
-O
filename True if file exists and is owned by the effective user id.
-r
filename Check if file is a readable
-S
filename Check if file is socket
-s
filename Check if file is nonzero size
-u
filename Check if file set-ser-id bit is set
-w
filename Check if file is writable
-x
filename Check if file is executable

Attention au espace

Comptage argument

if [ $# -eq 2 ];then echo "ok 2 arg arg1:$1 arg2:$2" else echo "miss arg you got $# arg and we wait 2 arg" fi

exemple: test dir

if [[ ! ( -d /tmp/mountpoint/) ]];then echo "point de montage manquant" fi

exemple: substring test

-q = silence
if grep -q ${test} /tmp/ade.html then echo "Ade ok : chaine de test localisé" exit 0 else echo "Ade ko:Erreur chaine de test non localisé" exit 2 fi

exemple: test fichier

Ici je cherche a lancer run.sh qui ne ce trouve pas au meme endroit suivant les serveurs
result="getTriodePort not found" if [ -f ./getTriodePort/run.sh ];then result=`./getTriodePort/run.sh` fi if [ -f /home/gadillel/script/getTriodePort/run.sh ];then result=`/home/gadillel/script/getTriodePort/run.sh` fi

Lecture fichier

incodeout
10 11 12
20 21 22
while read ligne;do
	echo $ligne
done< fichier.txt
10 11 12
20 21 22
10,11,12
20,21,22
for ligne in `cat test.log`;do	
	if [ "$ligne" = "" ]; then break; fi
	set -- $ligne
	a=$1
	echo "element $a"	
done
element 10,11,12
element 20,21,22
10,11,12
20,21,22
for ligne in `awk -F ',' '{print $1" "$2" "$3}' test.log`;do	
	if [ "$ligne" = "" ]; then break; fi
	set -- $ligne
	a=$1
	echo "element $a"	
done 
element 10
element 11
element 12
element 20
element 21
element 22
10,11,12
20,21,22
while IFS=, a b c ;do
	echo "a:$a"
	echo "b:$b"
	echo "c:$c"
done < fichier.txt
a:10
b:11
c:12
a:20
b:21
c:22
contient 10 11 12
20 21 22
IFS=$(echo -en "\n\b")
for line in `cat /opt/logs/consolidated/uk/2010/201010/SearchLog_20101026_1.test |head`;do echo "toto: $line";done
# sans le premier IFS on a une ligne par nombre (espace est un séparateur)
IFS=o #repalce les separateur normaux
10 11 12
20 21 22
Le set -- $ligne split $ligne en morceaux d'espace et retour chariot
Le IFS=# spliterais sur ls #

Array

${arr[*]} # All of the items in the array
${!arr[*]} # All of the indexes in the array
${#arr[*]} # Number of items in the array
${#arr[0]} # Length of item zero
#!/bin/bash
array=(one two three four [5]=five)
echo "Array size: ${#array[*]}"
echo "Array items:"
for item in ${array[*]}
do
    printf "   %s\n" $item
done

echo "Array indexes:"
for index in ${!array[*]}
do
    printf "   %d\n" $index
done

echo "Array items and indexes:"
for index in ${!array[*]}
do
    printf "%4d: %s\n" $index ${array[$index]}
done

String

Replace:

stringZ=abcABC123ABCabc
echo ${stringZ/abc/xyz} # xyzABC123ABCabc
# Replaces first match of 'abc' with 'xyz'.
echo ${stringZ//abc/xyz} # xyzABC123ABCxyz
# Replaces all matches of 'abc' with # 'xyz'.
Test:

a=${ligne/$test*/}		#on coupe des que l'on trouve ce que l'on veux et on met le debut dans a
if [ "$ligne" != "$a" ];then #du coups si on trouve $ligne != $a
echo "$test et dans $ligne"
fi

ligne="test ligne"
test="ligne"
a="test"

Exemples

run perf : Exemple sur le lancement de jar java
exemple_ldap : Cut sort unic + ldap

Faire des lient symbolique de 01 à 12 (mois de l'année)

for((i=1;i<=12;i=i+1));do if [ 10 -gt $i ];then b="0$i";else b=$i;fi;ln -fs 2007-08 2010-$b;done #version longue for((i=1;i<=12;i=i+1)) do if [ 10 -gt $i ] then b="0$i" else b=$i fi ln -fs 2007-08 2010-$b done

String comparaison

if [ ${Login} != "Login" ]; then echo "change your login" fi

Remplacement dans une liste de fichier d'une string

for i in $(find . -regex ".*html");do cat $i | awk '{ sub("</body>","<object type=\"text/html\" data=\"./common/piedpage.html\" width=\"160px\" height=\"600px\"></body>");print}' > $i.toto ;mv $i.toto $i ;done;

find . -regex ".*html"

Recherche les fichiers et affiche que ceux correspondant a la regex
. =n'importe qu'elle character
* repeter0 ou n fois)

Remplacement dans une liste de fichier (contenant un truc puis filtré) d'une string

Remplacer dans des fichier une string par une autre
for i in $(grep -RF "FR - Gre" * | grep xml| cut -d: -f1 | grep test); do cat $i | awk '{ sub("FR - Grenoble","FR-Grenoble");print}' > $i.toto ;mv $i.toto $i ;done;

Analyse code formaté

for i in $(grep -RF "FR - Gre" * | grep .xml | cut -d: -f1 | grep test);
do cat $i | awk '{ sub("FR - Grenoble","FR-Grenoble")print}' > $i.toto
mv $i.toto $i
done;

Analyse boucle

for in i in groupe1 ;
do groupe2
mv
done
Pour tous les fichier sortie par groupe 1
J'execute groupe 2 puis un mv

Analyse groupe1


grep -RF "FR - Gre" *
Cherche tous les fichier contenant FR ... recursivement
R = recursif fouille tous les sous rep
F = patern fix (ou cherche sa sans l'interpreter bétement)
"Fr - Gre" = ce que je cherche
* = tous les fichier et sous repertoir
Sa me renvoit un truc de la forme
grep -RF "FR - Gre" *
vacance/vacance.html:FR - Gre
vacance/vacance.xml:FR - Gre

|
Me renvoie sa dans la commande suivante

grep .xml
Me suprine tous les fichiers qui ne contiennent pas dans leur nom .xml

cut -d: -f1
Garde la partie avant les :
-d: definie : comme le delimiteur (séparateur)
-f1 ne garde que le champs 1 en sortie

Analyse groupe2


cat $i
Je liste le contenue des fichiers issue du groupe 1 sur le qu'elle on boucle

awk '{ sub("FR - Grenoble","FR-Grenoble");print}'
Je recupe toute les ligne et les affiche en sortie si elle contiennt FR - Grenoble je remplace par FR-Grenoble

$gt;$i.toto
fichier temps apres je fais le mv poru remettre sur l'original

Exemple cut sort uniq

toto.txt:
Login,Location,Password
titi,UK - London,Password
tata,UK - London,Password
toto,ES - Madrid,Password,pasglop
cat exportAD.csv.1243415908289 | cut -d, -f 2 | sort | uniq
ES - Madrid
Location
UK - London
le sort est obligatoir car le uniq ne marche que sur des elements qui ce suive

Exemple update de database:

Fichier d'entré du script
"Work Location","Employee User Id","New UserId","Name","Yahoo EMAIL ","Kelkoo EMAIL",
"UK - London","toto",,"tata","tataa@yahoo.com","tataa@yahoo.com@hotmail.fr",
"FR - Paris","ADRIEN",,"Adrien le chauve","adrien@yahoo.com","adrien@hotmail.fr",

Le script bash
list=$1
while IFS=, read pos prenom nom groupir old new ;do
printf "update profiles set mail = $new where mail = $old\n";
done < $list
rediriger la sorti dans script.mysql
mysql -umonuser -pmonpassword -hmadatabase matable < script.mysql

truc

date

date -d "1970-01-01 UTC + 1263486436 seconds"
jeu. janv. 14 17:27:16 CET 2010

date -d "2010-01-14 + 17 hours + 27 minutes + 16seconds" +"%s"
1263486436

date +%Y-%m-%d --date='-10 month'

redirection

cat test.sh
echo "test"
echo This message goes to stderr >&2

./test.sh > test.txt 2>&1

color

List of Color code
Couleur TexteArrière-plan
Noir3040
Rouge3141
Vert3242
Jaune3343
Bleu3444
Magenta3545
Cyan3646
Blanc3747

printf '\033[0;32;47m\tFinish\n\033[0m'
0, 1, 21, 4, 24, 5, 25, 7, 27 et ont respectivement pour effet : normal, gras, non gras, souligné, non souligné, clignotant, non clignotant, inversé, non inversé.

\033 escape sequence
[ m --> encadre le choix couleur
0 police
32 text
47 arriere plans

\033[0m default

Awk


Fichiers

(awk -F '=' '{print $2}' in.log > out.log)
in.log: toto=titi
out.log : titi

(awk -F ' ' '{print $2,$4}' in.log > out.log)
in.log: toto titi tata br
out.log : titi br

(awk -F ' ' '{print "http://dev.monsieurprix.com/search?s="$1}' in.log > out.log)
in.log: toto tata
out.log : http://dev.monsieurprix.com/search?s=toto
in.log: aaaaa
bbb
10h20
ORA
adz
11h
ORA
awk '$1 !~ /^ORA/ {n=$0} ; /^ORA/ {c+=1;print n "\n" $0} ; END {print c, "occurences"}' < a1

Recuperation variable

a=$(echo ${release} | awk -F '.' '{print $1" "$2" "$3}')
echo "a: $a"    
set -- $a
Major=$1
Minor=$2
PatchLevel=$3
echo "Major: $1  Minor: $2 Patch: $3"
$release 1.11.0
$a=1 11 0
Major: 1 Minor: 11 Patch: 0


Remplacement dans un fichier

gsub = all occurence
sub = 1er occurence
cat $list.tmp | awk '{gsub("\\\"","");print}'
cat $list.tmp | awk '{sub("\\\"","");print}'
on remplace dans le ficheir $uid la ligne qui commence par cn:< par "cn: "val (val=variable val)
cat $outdir/$uid.ldif | awk -v val="$val" ' /cn:
for var in uk de dk nl no it es be se nb
do
        cat /home/lionel/instance1/conf/Catalina/localhost/fr.xml | awk '{ sub("/fr/","/'$var'/");print}' >  /home/lionel/instance1/conf/Catalina/localhost/$var.xml
done
fr.xml (in):http://gadille.free.fr/fr/
uk.xml (ou):http://gadille.free.fr/uk/
de.xml (ou):http://gadille.free.fr/de/


awk -F ":" '{ $2 = "" ; print $0 }' /etc/passwd imprime chaque ligne du fichier /etc/passwd après avoir effacé le deuxième champ
awk 'END {print NR}' fichier imprime le nombre total de lignes du fichiers
awk '{print $NF}' fichier imprime le dernier champs de chaque ligne
who | awk '{print $1,$5}' imprime le login et le temps de connexion.
awk 'length($0)>75 {print}' fichier imprime les lignes de plus de 75 caractères. (print équivaur à print $0)
# precede chaque ligne par son numéro pour ce fichier (alignement à gauche).
awk '{print FNR "\t" $0}' files*

# precede chaque ligne par son numéro Pour l'ensemble des fichiers, avec une tabulation.
awk '{print NR "\t" $0}' files*

# énumère chaque ligne d'un fichier (le nombre est à gauche, aligné à droite)
awk '{printf("%5d : %s\n", NR,$0)}'

# énumère chaque ligne du fichier, mais ecrit seulement les nombres si la ligne n'est pas vide
awk 'NF{$0=++a " :" $0};1'
awk '{print (NF? ++a " :" :"") $0}'

# compte les lignes (comme "wc -l")
awk 'END{print NR}'

# écrit la somme des champs de chaque ligne
awk '{s=0; for (i=1; i<=NF; i++) s=s+$i; print s}'

# ajoute tous les champs de toutes les lignes et affiche la somme
awk '{for (i=1; i<=NF; i++) s=s+$i}; END{print s}'

# affiche chaque ligne après avoir remplacé chaque champ par sa valeur absolue
awk '{for (i=1; i<=NF; i++) if ($i < 0) $i = -$i; print }'
awk '{for (i=1; i<=NF; i++) $i = ($i < 0) ? -$i : $i; print }'

# affiche le nombre total de champs ("mots") de toutes les lignes
awk '{ total = total + NF }; END {print total}' fichier

# affiche le nombre total de lignes qui contiennent "Beth"
awk '/Beth/{n++}; END {print n+0}' fichier

# affiche le premier champ le plus grand et la ligne qui le contient
awk '$1 > max {max=$1; maxline=$0}; END{ print max, maxline}'

# affiche le nombre de champs de chaque ligne, suivi par la ligne
awk '{ print NF ":" $0 } '

# affiche le dernier champ de chaque ligne
awk '{ print $NF }'

# affiche le dernier champ de la dernière ligne
awk '{ field = $NF }; END{ print field }'

# affiche toutes les lignes de plus de quatre champs
awk 'NF > 4'

# affiche toutes les lignes dans lesquelles la valeur du dernier champ est supèrieure à 4
awk '$NF > 4'

# crée une chaine d'une certaine longueur (c'est-à-dire avec 513 espaces)
awk 'BEGIN{while (a++<513) s=s " "; print s}'

# insére une chaine d'une certaine longueur à une certaine position de caractère
# Exemple: insére 49 espaces après la colonne 6 de chaque ligne en entrèe.
gawk --re-interval 'BEGIN{while(a++<49)s=s " "};{sub(/^.{6}/,"&" s)};1'

# crée un tableau nommé month, indexé par des numéros afin que month[1]
# soit 'Jan', month[2] 'Feb', month[3] 'Mar' et ainsi de suite.
split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", month, " ")

# crée un tableau appelé "mdigit", indexé par des chaines, afin que
# mdigit["Jan"] soit 1, mdigit["Feb"] 2, etc. Necessite un tableau "month"
for (i=1; i<=12; i++) mdigit[month[i]] = i

# Dans un environnement UNIX, convertit des lignes DOS (CR/LF) en format Unix
awk '{sub(/\r$/,"")};1' # suppose que chaque ligne finit par Ctrl-M

# Dans un environnement UNIX convertit des lignes Unix (LF) en format DOS
awk '{sub(/$/,"\r")};1'

# Dans un environnement DOS convertit des lignes Unix (LF) en format DOS
awk 1

# Dans un environnement DOS convertit des lignes DOS (CR/LF) en format Unix
# Ne peut être fait avec les versions DOS de awk, autres que gawk:
gawk -v BINMODE="w" '1' infile >outfile

# supprimer les espaces principaux (espaces, tabulations) au début de chaque ligne
awk '{sub(/^[ \t]+/, "")};1'

# supprime les espaces finaux (espaces, tabulations) de la fin de chaque ligne
awk '{sub(/[ \t]+$/, "")};1'

# supprime les espaces au début et à la fin de chaque lignes
awk '{gsub(/^[ \t]+|[ \t]+$/,"")};1'
awk '{$1=$1};1' # supprime également des espaces supplémentaires entre les champs

# insére cinq espaces vides au début de chaque ligne (fait une page de décalage)
awk '{sub(/^/, " ")};1'

# aligne le texte à droite avec une largeur de 79-colonnes
awk '{printf "%79s\n", $0}' fichier*

# centre le texte avec une largeur de 79-caractères
awk '{l=length();s=int((79-l)/2); printf "%"(s+l)"s\n",$0}' fichier*

# remplace (trouve et remplace) "foo" par "bar" dans chaque ligne
awk '{sub(/foo/,"bar")}; 1' # remplace seulement la première occurence
gawk '{$0=gensub(/foo/,"bar",4)}; 1' # remplace seulement la quatrième occurence
awk '{gsub(/foo/,"bar")}; 1' # remplace toutes les occurences de la ligne

# remplace "foo" par "bar" seulement pour les lignes qui contiennent "baz"
awk '/baz/{gsub(/foo/, "bar")}; 1'

# remplace "foo" par "bar" sauf pour les lignes qui contiennent "baz"
awk '!/baz/{gsub(/foo/, "bar")}; 1'

# modifie "scarlet" ou "ruby" ou "puce" en "red"
awk '{gsub(/scarlet|ruby|puce/, "red")}; 1'

# inverser l'ordre des lignes (comme avec "tac")
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' fichier*

# si une ligne se finit par un backslash, ajoutez la ligne suivante à celui-ci (cela échoue si il y a plusieurs lignes
#finissant par un backslash...)
awk '/\\$/ {sub(/\\$/,""); getline t; print $0 t; next}; 1' fichier*

# affiche et trie les noms de login de tous les utilisateurs
awk -F ":" '{print $1 | "sort" }' /etc/passwd

# affiche les deux premiers champs, en ordre inverse de chaque ligne
awk '{print $2, $1}' file

# échange les deux premiers champs de chaque ligne
awk '{temp = $1; $1 = $2; $2 = temp}' fichier

# affiche chaque ligne, en supprimant le second champ de cette ligne
awk '{ $2 = ""; print }'

# affiche dans l'ordre inverse les champs de chaque ligne
awk '{for (i=NF; i>0; i--) printf("%s ",$i);print ""}' file

# concatene toutes les 5 lignes en entrée, en employant un séparateur virgule
# entre les champs
awk 'ORS=NR%5?",":"\n"' file

# affiche les 10 premières lignes du fichier (émule le comportement de la commande "head")
awk 'NR < 11'

# affiche la première ligne du fichier (émule "head -1")
awk 'NR>1{exit};1'

# affiche les deux dernières lignes d'un fichier (émule "tail -2")
awk '{y=x "\n" $0; x=$0};END{print y}'

# affiche la dernière ligne d'un fichier (émule "tail -1")
awk 'END{print}'

# affiche seulement les lignes qui correspondent à une expression régulière (émule "grep")
awk '/regex/'

# affiche seulement les lignes qui ne correspondent pas à une expression régulière (émule "grep -v")
awk '!/regex/'

# affiche toutes les lignes où le champ #5 est égal à "abc123"
awk '$5 == "abc123"'

# affiche seulement les lignes où le champ #5 n'est pas égal à "abc123"
# cela affichera aussi les lignes qui ont moins de 5 champs.
awk '$5 != "abc123"'
awk '!($5 == "abc123")'

# correspondance avec un champ à l'aide d'une expression régulière
awk '$7 ~ /^[a-f]/' # affiche la ligne si le champ #7 correspond à l'expression régulière
awk '$7 !~ /^[a-f]/' # affiche la ligne si le champ #7 ne correspond pas à l'expression régulière

# affiche la ligne immédiatement avant une expression, mais pas la ligne contenant l'expression
awk '/regex/{print x};{x=$0}'
awk '/regex/{print (NR==1 ? "match on line 1" : x)};{x=$0}'

# affiche la ligne immédiatement après l'expression, mais pas la ligne contenant l'expression
awk '/regex/{getline;print}'

# fait une recherche avec grep pour AAA et BBB et CCC (dans n'importe quel ordre sur la même ligne)
awk '/AAA/ && /BBB/ && /CCC/'

# fait une recherche avecc grep pour AAA et BBB et CCC (dans cet ordre)
awk '/AAA.*BBB.*CCC/'

# affiche seulement des lignes de 65 caractères ou plus
awk 'length > 64'

# affiche seulement des lignes de moins de 65 caractères
awk 'length < 64'

# affiche la partie du fichier depuis l'expression régulière jusqu'à la fin du fichier
awk '/regex/,0'
awk '/regex/,EOF'

# affiche la partie du fichier basée sur les numéros de ligne (lignes 8-12, inclus)
awk 'NR==8,NR==12'

# affiche la ligne numéro 52
awk 'NR==52'
awk 'NR==52 {print;exit}' # plus efficace avec de gros fichiers

# affiche une partie d'un fichier entre deux expressions régulières (inclus)
awk '/Iowa/,/Montana/' # sensible à la casse

# supprimer toutes les lignes vides d'un fichier (même chose que "grep '.' ")
awk NF
awk '/./'

# supprime des doublons et des lignes consécutives (émule "uniq")
awk 'a !~ $0; {a=$0}'

# supprime les doublons et les lignes non-consécutives
awk '!a[$0]++' # script plus concis
awk '!($0 in a){a[$0];print}' # script plus efficace