A to taki zbiór używanych przeze mnie “jednolinijkowców” sed-a, awk, czasami też perla. Zdarza się, że potrzebujemy szybko wykonać jakieś czynności na większej liczbie plików i kilku serwerach, dlatego grzebanie w pojedynczych plikach ręcznie mija się z celem. Podejrzewam, że każdy znajdzie tutaj coś dla siebie. Ale jeśli myślicie, że te przykłady są zaawansowane, to popatrzcie na to: bash invaders oraz na sedtris
# kasuje # między bond0:1 a network w pliku test.txt sed '/bond0:1/,/network/ s,^#,,g' test.txt # drukuje tekst między szukanymi word1 i word2 sed -n '/word1/,/word2/p' file.txt # kasuje cały wiersz ze słowem 'kasuj' sed '/kasuj/d' plik.txt # zahashuj linie od mapper włącznie do EOF włącznie sed -i '/mapper/,/EOF/ s,^,#,g' fstab # zahashuj linie pomiędzy in case of i EOF bez tych linii sed '1,/in case of/! {/EOF/,/in case of/!s,^#,,g}' /etc/fstab # zostawia z danego stringa tylko te znaki, które pasuja do wyrażenia regularnego echo /opt/app/bo1-prod/ | sed -e 's,.*\([b|f]o[1-4]-prod\).*,\1,' bo1-prod # listuje funkcje zdefiniowane w .bash_profile i/lub .bashrc set | fgrep " ()" compgen -A function declare -F | sed 's/^declare -f //' declare -F | cut -d ' ' -f 3 # usuwa tagi html sed -r 's,<[^>]*>,,' sed -r 's,(<|/\*)[^>]*|(>|\*\/),,g;/^ *$/d' # usuwa znaki nowej linii tr -d '\n' sed '{:q;N;s/\n//g;t q}' plik.txt # zastępuje znak nowej linii spacją tr '\n' ' ' # wstaw : co każde dwa znaki sed 's,..,&:,g;s,:$,,' # liczy wystąpienia danego regexpa (tu akurat robi to samo, co wc -l) sed -n '$=' # zamiana lub dodanie czegoś po pierwszym wystąpieniu wzorca w pliku sed -e '0,/RewriteEngine On/s/RewriteEngine On/RewriteEngine On\r\nDUPA/' apache2.conf # wypisanie sumy MD5 z pliku zawierającego te sumy :) grep -E '.*([a-f0-9]{32}).*' file | sed -e 's,.*\([a-f0-9]\{32\}\).*,\1,g' > file_clean # Jose's sed :) | sed -e 's/.*\([a-fA-F0-9]\{32\}\).*/\1/' # liczy połączenia ustanowione na porcie 80 i sortuje wg ilości wystąpień netstat -atun | grep ESTABLISHED | grep ":80" | awk '{print $5}' | cut -d: -f1 | sed -e '/^$/d' |sort | uniq -c | sort -n # IP address sed -r '^(([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-4])\.){3}([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-4])$' # usuwa białe znaki sed -e 's,[ \t],,g' # usuwa białe znaki i puste linie sed -E "/^(([\t ])?^$)|^#/d" # usuwa linie X sed 'Xd' # perl hack to show stars * as a filesystem usage du -k | sort -n | perl -ne 'if ( /^(\d+)\s+(.*$)/){$l=log($1+.1);$m=int($l/log(1024)); printf ("%6.1f\t%s\t%25s %s\n",($1/(2**(10*$m))),(("K","M","G","T","P")[$m]),"*"x (1.5*$l),$2);}' # szukanie określonych typów plików we wskazanych kilku lokacjach find {data/posting,data/resume} -type f \( -name "*.Index" -o -name "*.bin" -o -name "*.Vocab" \) # odzyskanie pojedynczej bazy z full dump-a mysql (--all-databases) sed -n '/^-- Current Database: `test`/,/^-- Current Database: `/p' fulldump.sql > test.sql # dodanie tekstu w X linii sed -i Xi'#Constants to communicate to aggregator.\nTLK_AGGREGATOR_IP=\nTLK_AGGREGATOR_PORT=\n' # pętla (tak, sed obsługuje pętle ;) ) sed -e '{:loop s,:,l,g; t loop}' # usuwa błędne wpisy z known_hosts (błędne = fingerprint się zmienił, używać z głową!) ssh-keygen -f "/home/demo/.ssh/known_hosts" -R localhost # sumuje w kolumnach i dzieli przez ilość elementów echo -e "1\n2\n3"|awk '{sum += $NF} END {print sum/$NF}' # dodaje coś na koniec linii sed -i '$a FC_iconvPath=/usr/bin/iconv' properties.txt # dodaje do pierwszej linii sed -e '1i TalentFilterAuthorizationToken=' properties.txt # dodaje PO pierwszej linii sed -e '1a TalentFilterAuthorizationToken=' properties.txt # liczy ilość linii w plikach *.cf* find . -type f -iname "*.cf*" -exec wc -l {} \; |awk '{print $1}'|awk '{sum += $NF} END {print sum}' # usuwa z tekstu niedrukowalne znaki ascii (non-printable ascii) [sed: -e expression #1, char 21: Invalid collation character] LC_ALL="POSIX"; POSIXLY_CORRECT=oeu; sed -i 's,[\x80-\xFF],.,g' plik.txt LC_ALL="POSIX"; POSIXLY_CORRECT=oeu; sed -e 's,\xB6,ś,g' # pokazuje X-linię (print line) sed -n '45p' file awk 'NR==45' file # odczytuje zewnętrzne IP wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//' wget -q -O - ifconfig.me/ip # wypisuje zakres/rangę znaków awk '{for (i=4; i<NF; i++) print $i ; print $NF}' # dokładne dopasowanie wzorca w sedzie sed -e "s,\,,g"
Tak, dokładnie taka ściągawka była mi potrzebna jakiś czas temu i oczywiście jej nie było :)
Do IP używałem zawsze czegoś takiego:
myip=”$(wget http://checkip.dyndns.org -q -O – | sed ‘s/.*ss:\ //;s/<\/b.*//')"
echo $myip
Pozdro