#linux #awk #sed
Mireczki, mam do zrobienia takie zadanie:

"Z wyników zwracanych przez polecenie ifconfig wybierz informacje o adresie IP oraz adresie
MAC wszystkich aktywnych kart sieciowych. Informacje te zapisz do pliku interfaces.txt,
który powinien zawierać trzy kolumny: intname, ipaddress, mac_address a kazdy wiersz
opisywać określoną, aktywną kartę."

Moje pytanie jest takie, w jaki sposób mogę "wyciąć" informacje o adresie IP i MAC, a następnie przenieść do osobnego pliku przy
#regexp #sed #awk #programowanie
Poproszę o pomoc z windowsowym (gnuwin32) awk/gawk/sed lub alternatywą pod windowsem.

Pliki z danymi wejściowymi mają format (przykładowy wiersz)
yzz-0000001000-v1000,"54,76","54,76",0,"54,76","54,76"
Chcę otrzymać
yzz-0000001000-v1000;54,76;54,76;0;54,76;54,76
czyli zmienić separatory między polami z przecinka na średnik, jednocześnie nie zmieniajac separatorów części ułamkowych.

Znalazlem w sieci sugestie regexpa

/(,)(?=(?:[^"]|"[^"]*")*$)/
i na testerze online jest ok, ale nie potrafię wyescapować tak by działało.

gawk "{gsub(/(,)(?=(?:[^\""]|\""[^\""]*\"")*$)/,\""x\""); print}" plikwejsciowy
nie zmienia nawet pierwszego przecinka.
Co robię
  • 0
Interesujące, ale racji obostrzeń (i drobnego wpływu wina które skonsumowalem ;)) sugeruję rozbicie po prostu na trzy przejscia, w pierwszym łap "\d+,\d+," jako grupę i zamieniaj drugi przecinek na srednik, w drugim [a-Z-0-9]*, by tez pierwszy srednik zalatwic w trzecim wiadomo, wywalic cudzyslowie. W tym stanie niestety to najlepsza podpowiedz jaka moga zaoferowac :)
@uhu8
  • Odpowiedz
Czesc,
podsuniecie mi pomysl w jaki sposob moge uzyskac zamierzony efekt?

Dla uproszczonego testu mam sobie plik text.txt

START_LINE
multi
line
string
MY_END_LINE
1
2
3
4
5
6

Zalezy mi na tym aby wybrac zakres pomiedzy START_LINE a MY_END_LINE + 6 linii tekstu
Jak wiec zmodyfikowac ponizsze aby dolaczyc kolejne linie?

sed -n '/^START_LINE$/,/^MY_END_LINE/p' text.txt
Problem w tym ze moim jedynym pkt odniesienia w duzym pliku bedzie START_LINE oraz MY_END_LINE,
@OperatorHydrolokator: hmm to zdefiniuje zakres od START_LINE do ostatniej pustej.
W pliku sa transakcje, w roznych sekcjach znajduja sie puste linie, wiec to nie moze byc punkt odniesienia.

Jesli wiec transakcja ma swoj specyficzny poczatek to potrzebuje ja cala wylapac. Na samym dole (5 i 6) znajduje sie linia adresowa, gdzie w zaleznosci od miejsca moze byc inna :)

W skrocie - gdy zaczyna sie od STARTLINE, chce wylapac wszystko do
  • Odpowiedz
Mam takie coś w sed żeby zmieniać sobie config firefoxa z linii komend.

sed -i 's^user_pref("'$1'",.*);^user_pref("'$1'",'$2');^' user.js
root@92d87ffbe423:~/.mozilla/firefox/egtw4p6p.default# ./ffset.sh general.useragent.override '"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.37"'
sed: -e expression #1, char 103: unterminated `s' command

Jak tylko napotka na spację w argumencie to wywala mi takim błędem. Co zrobiłem nie tak?

#sed #linux #linuxmasterrace
Pany, trochę w nawiązaniu tego tematu https://www.wykop.pl/wpis/27972167/ziomale-mam-taki-tam-pliczek-wiersze-zaczynaja-sie/ . To sobie napisałem, okej. A jeśli temat zmodyfikujemy - chcę podzielić ten plik na podstawie zmiany pierwszego znaku w linii, bo powiedzmy, że indeksy nie zawsze zaczynają się od cyfra+000 i nie kończą na cyfra+999, czyli jak skrobnąć jakąś linijkę, która takie coś użre?
#sed #bash #skryptowanie #linux
Ja bym to skryptem basha załatwił. Jak nie będzie za chwilkę odpowiedzi to tobie napisze. A spacje na początku lub odstępy ma ignorować?
  • Odpowiedz
#!/bin/bash

FILE='test.file'

while read LINE
do
if [ "$LINE" = "" ]
then
continue
fi

FIRSTL="$(echo $LINE | head -c 1)"
echo $LINE >> $FIRST
L'.txt'

if [ "$FIRSTL" != "$OLDL" ]
then
echo
fi

OLDL=$FIRSTL

done < $FILE

Spóźniłem się :)
  • Odpowiedz
Kupiłem MX200, jako że szyfruję zawsze wszystkie dyski i ten zaszyfrowałem VeraCrypt.

Niestety spadek prędkości był o 50% na odczycie i zapisie sekwencyjnym. I ponad 10x razy wolniej na 4k-64thrd.


Po małym research-u okazało się że ten SSD wspiera standard Opal 2.0. Czyli SED - "Self-Encrypting Drive", czyli samo szyfrujące się dyski.


Tak wiec zamiast używać szyfrowania programowego lepiej włączyć sprzętowe. Nie tracimy nic na wydajności, szyfrowanie jest przezroczyste dla systemu itp.
@c9f24440e055136e5ee3dfa934d3933f: Fakt, ale jak pisałem spadek szybkości u mnie był spory. Dysk jest zabezpieczony przed złodziejami itp. Ba nawet przed Polskimi agencjami, nawet jak były jakiś backdoor to przy błahych sprawach nikt tego nie wyda Polsce. Nie jestem jakimś terrorystą żebym się tym przejmował, chce zachować w miarę dobra prywatność. Ale i tak używam VeraCrypt na innych dyskach "magazynach". SED tylko jako systemowy.
  • Odpowiedz
Wyczytalem jednak ze tryb uśpienia S3 jest nie obsługiwany przez sedutil, czyli pozostaje hibernacja, czy w tym przypadku jesli używamy hibernacji to przy kazdym wznowieniu trzeba podawać hasło ?
  • Odpowiedz
Używając programu Sed mam zamienić w pierwszych pięciu linijkach pliku tekstowego słowo "Faculty" lub "Faculties" na słowo "School" i wyświetlić te linijki. Wpiasłem:

sed -en '1,5s/Faculty/School/gp;1,5s/Faculties/School/gp' d.txt


i wyskakuje

sed: nie można odczytać 1,5s/Faculty/School/gp;1,5s/Faculties/School/gp: Nie ma takiego pliku ani katalogu


Co robię źle? Plik d.txt na pewno istnieje.

#linux #sed
Dla kompletności:

$ echo '/dev/sda6: UUID="785b1416-ffbf-43e2-8a5c-052"' | awk -F: '{print $1}'

/dev/sda6

$ echo '/dev/sda6: UUID="785b1416-ffbf-43e2-8a5c-052"' | sed -r 's/:.*$//'

/dev/sda6
  • Odpowiedz