sed oneliners 7 May 2012

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"

Tagi: , , , , ,


Odpowiedzi: 2 do wpisu “sed oneliners”

  1. cond says:

    Tak, dokładnie taka ściągawka była mi potrzebna jakiś czas temu i oczywiście jej nie było :)

  2. rtgn says:

    Do IP używałem zawsze czegoś takiego:
    myip=”$(wget http://checkip.dyndns.org -q -O – | sed ‘s/.*ss:\ //;s/<\/b.*//')"
    echo $myip

    Pozdro

Zostaw odpowiedź do rtgn