Megpróbálom rendezni a naplóimat, és azt tapasztaltam, hogy az egyjegyű dátumokat helytelenül vágták ki. Most szeretném vagy adj 0-t, vagy távolítsd el a plusz helyet.
Előtte meg akartam nézni, hogyan lehet megszerezni a szerkeszteni kívánt sorokat.
Az utolsó 3 sor farka:
$tail -3 testlog Wed Feb 7 23:30:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:40:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:50:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN)
Most a szkript felé haladva ezt írtam, arra számítva, hogy ugyanazt az eredményt kapom:
$ while read line; do if [ $(echo $line|cut -c7) == "b" ]; then echo $line; fi; done < testlog | tail -3 Wed Feb 7 23:30:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:40:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:50:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN)
De ezzel a 7 előtti extra helyet eltávolítják. Nem számítottam rá, hogy ez megtörténik. Ugye, nem vágom le a szkriptemmel?
Előre is köszönöm!
Megjegyzések
- Mi a szófelosztás? Miért fontos ez a shell programozásban? , és BashGuide: Szófelosztás
- Vagy talán ezt kellene csak A másolat: Miért fojtja el a shell szkript a szóközöket vagy más speciális karaktereket?
- nagyszerű link @ilkkachu
Válasz
Ugyanezt észlelheti más duplázott (vagy több) szóköz esetén is. A nem jegyzett változóbővítéseket szófelosztás követi , így ha a szavakat szóközök osztják (IFS), azokat egy szóközzel egymás között összerakják.
Egy megkerülő megoldás lehet :
A shell a paraméterek kibővítésének, a parancsok cseréjének és az aritmetikai kiterjesztésnek az eredményeit vizsgálja dupla idézőjelek között fordulhatnak elő a szó felosztásához.
Konkrét példaként lásd:
$ line="Wed Feb 7 23:30:59" $ echo $line Wed Feb 7 23:30:59
szemben:
$ line="Wed Feb 7 23:30:59" $ echo "$line" Wed Feb 7 23:30:59
Érdemes elolvasni: Miért fojtja el a shell szkript a szóközöket vagy más speciális karaktereket?
megjegyzések
- példa:
var='1 1'
(sok szóközzel eltűnnek a jelölésben itt), amelyetecho $var
ésecho "$var"
követ. - Tulajdonképpen kitűnő pont; ' s azt a nem idézett visszhangot, amely ' elveszíti a szóközöket.
- nagyon világos! köszönöm @JeffSchaller és kusalananda