==== csv file ====
reorder member in csv file
# cat $file1 | awk -F';' '{ t = $3 ; $3 = $1; $1 = t; print; }' OFS=';' | sed 's/;/,/g' | awk -F',' '{ t = $2 ; $2 = $1; $1 = t; print; }' OFS=',' | sort > $file1.1
http://blog.fpmurphy.com/2008/10/ksh93-date-manipulation.html#sthash.oZOsKv15.dpbs
==== line number in a file ====
Find the line number for a specific pattern
[root@aixnim]/root# cat /etc/resolv.conf | perl -lne 'm|10.10.2.100| && print $.'
2
==== date conversion on AIX ====
On AIX you can install **coreutils** rpm package to convert date:
epoch to date
# /opt/freeware/bin/date -d @126507600
Fri Jan 4 06:00:00 1974
Convert date to epoch
# /opt/freeware/bin/date -d "UTC 1970-01-01 126507600 secs" "+%s"
126507600
==== Add line in ksh AIX ====
Diffrent commands exists, but **sed** AIX doesn't allow **a** option, so we can use perl:
# perl -pe 's/export TMOUT/$&\nFGOLD=\`echo "\\033[1;32m"\`/'
==== random number ====
Print a random number between 0 and 51
# let rand=$RANDOM%52
# echo $rand
==== count ====
Count number of a word in a line
# echo "aa:bb:cc:dd:ee" | sed 's/[^:]//g' | awk '{ print length }'
4
==== Suppress multiple blank space in a line / replace by only one blank space ====
# echo "a b c d" | tr -s " "
a b c d
==== How to remove special characters from files on UNIX ====
Remove special characters, blank spaces, ^M, ^@, ^I etc. (control M, control I, ...)
# sed 's/[^A-Za-z0-9_.;]//g' file_name1.txt > file_name1.txt
==== Debug a ksh script: ====
script.sh | truss -p $$ > /tmp/truss.log 2>&1
To log less:
truss -f -t !close -p $$ : suppress all close system call to reduce log size, and -f trace also children
==== trap command ====
trap 'command' signal_list
# kill -l : to list signals
| 1) HUP | HUP hangup : envoie un signal de réinitialisation |
| 2) INT | INT Interruption |
| 3) QUIT | QUIT Core dump : génère un fichier core. |
| 4) ILL | ILL Le programme tente d'exécuter du code malformé, inconnu ou avec de mauvais privilèges |
| 5) TRAP | TRAP Le programme envoie un signal au débugger (message capturé) |
| 6) IOT | IOT idem SIGABRT : interruption du programme |
| 7) EMT | EMT emulator trap : un programme émulé ou virtualisé a posé problème |
| 8) FPE | FPE floating-point exception : le programme a réalisé une opération arithmétique erronée |
| 9) KILL | KILL arrête le programme immédiatement |
| 10) BUS | BUS Le programme a causé une erreur de bus |
| 11) SEGV | SEGV Segmentation fault : le programme fait référence à un mauvais emplacement de mémoire |
| 12) SYS | SYS Un mauvais argument est passé en paramètre |
| 13) PIPE | PIPE Un programme tente d'écrire dans un pipe sans processus connecté à l'autre bout |
| 14) ALRM | ALRM La limite de temps est dépassée |
| 15) TERM | TERM Envoie un signal au programme pour le terminer |
| 16) USR1 | USR1/USR2 Envoie un signal dans des conditions définies par un utilisateur |
| 17) USR2 | |
| 18) CHLD | CHLD/CLD child : signal envoyé par un programme lorsqu'un processus fils est achevé |
| 19) PWR | PWR power : le système subit un problème d'alimentation |
| 20) VTALRM | VTALRM virtual alarm : signal envoyé lorsque le temps limite a été dépassé |
| 21) PROF | PROF profiler : signal envoyé lorsqu'un timer a expiré |
| 22) POLL | POLL polling : un problème est survenu lors d'un événement I/O asynchrone |
| 23) WINCH | WINCH window [size] change : signal envoyé au programme lorsque la fenêtre de contrôle change de taille |
| 24) STOP | STOP signal demandant au programme de se suspendre |
| 25) TSTP | TSTP tty stop : signal envoyé au programme lorsqu'un terminal suspend ses requêtes |
| 26) CONT | CONT Redémarre un programme suspendu par STOP |
| 27) TTIN | TTIN Le programme tente de lire tty alors qu'il est en arrière-plan |
| 28) TTOU | TTOU Le programme tente d'écrire sur tty alors qu'il est en arrière-plan |
| 29) URG | URG Un socket a une donnée urgente à lire |
| 30) LOST | LOST Le verrou d'un fichier a été perdu |
| 31) RESERVED | |
| 32) DIL | |
| 33) XCPU | XCPU Le programme a utilisé le CPU prend trop longtemps |
| 34) XFSZ | XFSZ Le fichier a dépassé la taille maximale autorisée |
| 35) bad trap | |
| 36) bad trap | |
| 37) RTMIN | RTMIN/RTMIN+n real-time minimum : signaux définis par l'application |
| 38) RTMIN+1 | |
| 39) RTMIN+2 | |
| 40) RTMIN+3 | |
| 41) RTMAX-3 | RTMAX/RTMAX-n real-time maximum : signaux définis par l'application |
| 42) RTMAX-2 | |
| 43) RTMAX-1 | |
| 44) RTMAX | |
===== List file permissions in octal =====
If you have the rpm package installed : coreutils
root@aixtest /etc> /opt/freeware/bin/stat -c "%a %n" /var/adm/wtmp.1.gz
664 /var/adm/wtmp.1.gz
root@aixtest /etc> /opt/freeware/bin/stat -c "%a %n" /var
755 /var
To be able to apply permissions on files, first save the permissions in octal format, it will be easier to recover all permissions:
ls -l | awk 'BEGIN {
v["r1"] = 400; v["w2"] = 200; v["x3"] = 100; v["s3"] = 4100; v["S3"] = 4000;
v["r4"] = 40 ; v["w5"] = 20 ; v["x6"] = 10 ; v["s6"] = 2010; v["S6"] = 2000;
v["r7"] = 4 ; v["w8"] = 2 ; v["x9"] = 1 ; v["t9"] = 1001; v["T9"] = 1000;
}
NF <= 2 { print $0 }
NF > 2 { val = 0; xa = " ";
for (i = 1; i <= 9; i++) val += v[substr($1, i+1, 1)i];
if (substr($1, 11, 1) == "+") xa = "+";
printf " %04d%c %s\n", val, xa, $0;
}'
Or more light:
ls -l | awk 'BEGIN {
v["r1"]=400; v["w2"]=200; v["x3"]=100; v["s3"]=4100; v["S3"]=4000
v["r4"]=40 ; v["w5"]=20 ; v["x6"]=10 ; v["s6"]=2010; v["S6"]=2000
v["r7"]=4 ; v["w8"]=2 ; v["x9"]=1 ; v["t9"]=1001; v["T9"]=1000}
{val=0
for (i=1;i<=9;i++) val=val+v[substr($0,i+1,1)i]
printf "%4d %s\n",val,$NF}'
===== Split full file in directory and file name =====
a='/var/spool/cron/crontabs/root'
dir=${a%/*}
file=${a##*/}
===== Last occurence of a word =====
Use the "rev" reverse command so you can suppress the first occurence and the reverse again:
For example remove the version string from rpm packages:
Before:
root@nimbcp - /root/scripts > rpm -qa
zip-3.0-1
unzip-6.0-2
bzip2-1.0.6-1
openldap-2.4.23-0.3
ganglia-gmond-python-examples-3.6.0-2
ganglia-mod_aixdisk-3.6.0-2
root@nimbcp - /root/scripts > rpm -qa | rev | cut -d'-' -f3- | rev
zip
unzip
bzip2
openldap
ganglia-gmond-python-examples
ganglia-mod_aixdisk
===== Update rpm package to latest version =====
If you have a big directory with serval versions of the same rpm, you can upgrade only the packages that are installed, just exclude source packages:
root@nimbcp - /export/other/rpm # for pkgi in $(rpm -qa | sort)
do
pkgs=$(echo $pkgi | rev | cut -d'-' -f3- | rev)
if [ $(ls ${pkgs}-[0-9]* > /dev/null 2>&1;echo $?) -eq 0 ]
then
pkgn=$(ls ${pkgs}-[0-9]* | sort | grep -v ".src." | tail -1)
if [ $(echo $pkgn | grep -v $pkgi > /dev/null 2>&1;echo $?) -eq 0 ]
then
echo rpm -Uhv $pkgn
fi
fi
done
==== Array on ksh93 ====
Define an array
# myarray=(a b c)
Add an element to the array
# myarray+=(a)
List nb of elements, and list elements
# echo ${#myarray[@]}
4
# echo ${myarray[*]}
a b c a
List all elements one by one
nb=${#myarray[@]}
for ((i=0; i