W Linuksie, jak wykonać wiele operacji na jednym ciągu poprzez potokowanie?

1

Na przykład,

Jeśli zrobisz free -m | sed -n 2p

Chcę pracować z danymi wyjściowymi z ostatniej , drugiej do ostatniej i trzeciej kolumny . Problem polega na tym, że chcę zachować spójność i użyć danych wyjściowych od freerazu.

Chcę być w stanie utrzymać spójność danych wyjściowych bez uruchamiania free -m | sed -n 2pi wyodrębniania tego, czego trzy kolumny potrzebuję trzy razy; Chcę móc to zrobić raz. Jak mogę to zrobić?


źródło
Tylko dla pewności, że rozumiem to poprawnie: Chcesz wygenerować zestaw danych, a następnie wygenerować trzy nowe niezależne zestawy danych na podstawie oryginalnego zestawu danych, ale bez generowania oryginalnego zestawu danych za każdym razem? Nie sądzę, że można tego dokonać po prostu za pomocą pipingu, ale może to być możliwe w przypadku plików podpowłoki lub plików tymczasowych.
Darth Android

Odpowiedzi:

2

Możesz chcieć za Awkto zawrócić.

[root@james-ws tmp]# free -m | sed -n 2p
Mem:          3948       3724        223          0        364        852
[root@james-ws tmp]# free -m | sed -n 2p | awk '{print $7, $6, $3}'
852 364 3718
qweet
źródło
0

Możesz użyć nazwanych potoków i awkpodzielić dane wyjściowe na 3 źródła. Następnie możesz przeczytać (raz) z każdego źródła.

mkfifo pipe1 pipe2 pipe3
free -m | sed -n 2p | awk '{ print $3 >> pipe1; print $6 >> pipe2; print $7 >> pipe3 }'

Nazwane rury pipe1i in. działają jak bufory, z których można odczytać, jakby były potokami.

cat pipe1 | this | that | the-other

lub najlepiej bez cat:

this < pipe1 | that | the-other

Pamiętaj, że po odczytaniu danych z potoku dane znikają, tak jakby dane wejściowe pochodziły ze zwykłego potoku.

chepner
źródło
0

Myślę, że najprostszym sposobem na to byłoby zapisanie linii statystyk w tablicy bash, a następnie dostęp do elementów tablicy:

memStats=( $(free -m | sed -n 2p) )
memStatElements=${#memStats[@]}
echo "last column: ${memStats[memStatElements-1]}"
echo "second-to-last column: ${memStats[memStatElements-2]}"
echo "second column: ${memStats[1]}" # Note that arrays are 0-based, so [1] is the second element
Gordon Davisson
źródło
0

Zamiast tego po prostu zapisałem freewynik w zmiennej i echo każdego wyniku osobno.

To jest mój wynik końcowy:

STRINGMEM=$(free -m | sed -n 2p | awk '{ print $7,$6,$3 }'); CACHED=$( echo $STRINGMEM | awk '{print $3}'); BUFFERED=$(echo $STRINGMEM | awk '{print $2}'); ACTIVE=$(echo $STRINGMEM | awk '{print $1}'); ACTIVE=$( (( ($BUFFERED + $CACHED) - $ACTIVE)) ); DATE=$(date +%s);

źródło