Znany również jako reverse cat, tac to proste narzędzie wiersza poleceń, które pozwala odwrócić wiersze na wyjściu za pomocą | wbudowany operator rur i tac. Oznacza to, że jeśli masz polecenie po lewej stronie (lhs) i chcesz odwrócić zawartość jego danych wyjściowych, wystarczy, że wpiszesz lhs | tac. Otóż to!
Trzeba przyznać, że jest więcej do taktu, niż na pierwszy rzut oka. Nie martw się. Omówimy to wszystko w odpowiednim czasie.
Porady dotyczące tac
Używać czy nie używać, oto jest pytanie. Przecież nie będziesz chciał tac, kiedy nie musisz. Jeśli jednak chcesz rozprowadzić tak, jak chleb z masłem, to zależy od Ciebie. W międzyczasie, oto moja rada, jak taktować obie strony, aby pozostać neutralnymi.
Kiedy używać tac
Są chwile, kiedy używać tac, które pomagają uzyskać więcej z wiersza poleceń przy mniejszej ilości kodu i czasu spędzonego na badaniu opcji poleceń lhs.
Gdy nie masz pewności co do opcji lhs
Wiele poleceń, takich jak sort, ma opcję odwrócenia wyniku polecenia. Jeśli jednak nie jesteś pewien, czy polecenie po lewej stronie ma opcję -r do odwrócenia wyjścia, użycie tac jest pewnym sposobem na odwrócenie linii wyjściowych.
Kiedy wydajność nie ma znaczenia
Chociaż nieistotne, większość poleceń używanych w połączeniu z wbudowaną opcją odwrócenia wyjścia działa lepiej niż przesyłanie wyjścia do tac. Więc jeśli niewielkie opóźnienie wydajności nie stanowi problemu, przejście do taktu w celu odtworzenia wyjścia w odwrotnej kolejności jest w porządku.
Kiedy nie używać tac
Są chwile, kiedy nie możesz użyć taktu, ponieważ wiesz lepiej. Oto kilka, na które warto zwrócić uwagę.
Gdy wiesz, że polecenie na lhs ma opcję odwrócenia linii wyjściowych
Jak powiedziałem: „Większość poleceń ma opcję odwrócenia wyjścia.” Jeśli wiesz, że określone polecenie lhs ma opcję, nie możesz używać tac. W końcu -r jest krótsze niż - | tac.
Kiedy wydajność ma znaczenie
Tak jak powiedziałem: „Korzystanie z opcji odwrotnej lewej strony może działać lepiej niż tac.” Jeśli chcesz wycisnąć kilka sekund w skrypcie bash lub masz do czynienia z większymi plikami, które wymagają czasu na odczytanie, nie możesz używać tac.
Tac pomoc
Uruchomienie polecenia pomocy dla tac lub man tac pokazuje użycie wraz z opcjami, które mogą być użyte. Oto czego się spodziewać.
Polecenia
tac --pomocWynik
Wersja taktyczna
W jakiej wersji jestem??
Jesteś najnowszą wersją siebie. Jednak w przypadku, w jakiej wersji jest twój tac, jest na to opcja.
Polecenia
tac --wersjaWynik
Uwagi
Jeśli używasz tac na FreeBSD lub macOS, długa opcja wersji może być niedostępna. W takim przypadku spróbuj -v lub man tac. Jeśli próbowałeś, daj mi znać. Jestem ciekaw. Dzięki
Opcje taktyczne
Oprócz pomocy i wersji tac nie ma wielu opcji. Za to, co ma, na pewno przekonasz się, że tac to nie tylko stary odwrócony kot.
Tac przed opcją
Opcja -b pozwala zmienić sposób dołączania separatora na wyjściu. Domyślnie separator nowego wiersza jest dołączany po każdym wierszu.
Wiem, że to mylące. Podzielmy to na przykład.
Najpierw zobaczmy, jak wygląda nasz wynik, zanim użyjemy tac -b.
Polecenia
sekw. 10Wynik
Zobaczmy teraz, w co zamienia się nasze wyjście po użyciu tac bez -b.
Polecenia
sekw. 10 | tacWynik
Zobaczmy teraz, w co wyjście zamienia się przy użyciu tac -b.
Polecenia
sekw. 10 | tac -bWynik
Opcja separatora Tac
Opcja separatora -s 'łańcuch literalny' pozwala określić znak lub sekwencję znaków używanych przez tac do odróżnienia linii. Domyślnie używany jest znak nowej linii ('0a' w szesnastce).
Jak korzystać z opcji separatora tac na początku nie jest oczywiste. Jednak gdy już wiesz, że tam jest, trudno nie spróbować go użyć.
Rozważmy następujący przykład, operując na liniach reprezentowanych w szesnastce.
Polecenia
sekw. 20 | xxd -ps | tac -s '0a' | xxd -ps -rWynik
Uwagi
(1) To może wydawać się trywialne, jak użycie sekwencji 20 | komenda tac, jednak w tym przypadku nie spędziliśmy czasu pracując nad strumieniem wyjściowym w hex. Używanie tego wzorca jest przydatne, gdy separacja nie jest czymś trywialnym, jak znak nowej linii, taki jak bajt zerowy.
Teraz mniej próbuj używać tac na czymś mniej surowym i bardziej meta, takim jak prosty HTML.
Rozważ następujący plik.
Plik
ZAb
do
Polecenia
plik () echo -e " Ab
do
";
plik | tac -s "
"
Wynik
Udało nam się przekonwertować stronę HTML
ZAb
do
w
dob
ZA
używając tac.
Załóżmy, że musisz zrobić coś bardziej skomplikowanego, na przykład traktować dowolny tag jako separator tac. W takim przypadku nie ujdzie ci na sucho samo użycie opcji separatora. Tutaj pojawia się opcja regex. W połączeniu z opcją separator pozwala to zrobić więcej z poleceniem tac niż odwrócić linię w pliku. Oto jak.
Opcja wyrażeń regularnych Tac
Opcja regex -r -s 'regex' pozwala określić, że ciąg separatora ma być traktowany jako wyrażenie regularne.
Korzystanie z opcji tac regex jest tak proste, jak dodanie opcji -r przed lub za separatorem.
Rozważ poprzedni przykład, używając opcji regex w połączeniu z opcją separatora. Niech tac traktuje dowolny znacznik znacznika jako separator.
Plik
proste funkcje
Funkcje w bashu są proste. Przynajmniej ten jest. Umieszcza na ekranie sznurek.
Polecenia
prosta funkcja
()
Echo
tak proste, jak to tylko możliwe prosta funkcja
Źródło: https://temptemp3.github.Funkcje io/bash
Polecenia
plik ()Echo '
proste funkcje
Funkcje w bashu są proste. Przynajmniej ten jest. To stawia
napis na ekranie.
Polecenia
prosta funkcja
()
Echo tak proste, jak to tylko możliwe
prosta funkcja
plik | tac -r -s "]*."
Wynik
Udało nam się przekonwertować stronę HTML odwracając plik za pomocą tagów HTML HTML. Jeśli przyjrzysz się szczegółom, zauważysz, że jeszcze nie jest idealny.
Polecenie Tac w czystym bash
Oto prymitywna wersja implementacji tac w czystym basha, która odwraca linie przesyłane przez polecenie lhs. Przyszłe wersje są pozostawione jako ćwiczenie.
#!/bin/bash## tak
## wersja 0.0.1 - inicjał
##################################################
tak()
lokalne -a arr
lokalne -i ja
plik mapy arr -
i="$#arr[@]"
while [ $i -ge 0 ]
zrobić
echo $arr[i]
niech ja-=1
gotowy
##################################################
tac
##################################################
Źródło: https://github.com/temptemp3/ba.sh/blob/master/tac.cii
Polecenie Tac przy użyciu innych poleceń
Oto kilka prymitywnych wersji implementacji tac, używających innych poleceń, które odwracają linie przesyłane przez polecenie lhs. Przyszłe wersje są pozostawione jako ćwiczenie.
Zanim zaczniemy, zamknij oczy i pomyśl: „Co można wykorzystać do wdrożenia prymitywnej wersji tac?”
Przychodzi mi na myśl wiele poleceń, ale skupię się na tych, na które mamy miejsce.
gapić się
Podobnie do polecenia Tac w czystym przykładzie basha, aby zaimplementować tac, najpierw przechowamy odczytane wiersze do odtworzenia w odwrotnej kolejności po przeczytaniu wszystkich wierszy. Oto jak by to wyglądało przy użyciu gawk.
gawk ' linia[++line[0]]=$(0) KONIEC for(i=0;i
Teraz spróbuj użyć polecenia lhs seq 10.
sekw. 10 | gawk ' linia[++line[0]]=$(0) KONIEC for(i=0;i
Jak można się spodziewać, wynik jest
Ćwiczenia
1. Funkcja lhs() seq 10 ; wyświetla liczby całkowite od 1 do 10. Napisz polecenie rhs takie, że lhs | rhs równa się 10864213579 tylko przy użyciu tac (Wskazówka: zobacz Tac przed przykładem opcji)
2. Odwróć wyjście rhs() find -mindepth 1 -maxdepth 1 -print0 ; używając tac (Wskazówka: zobacz przykład opcji separatora Tac)
3. Rozszerz tac.sh (w poleceniu Tac w czystym bash), aby zachowywać się dokładnie jak tac. Będziesz musiał dodać opcje i upewnić się, że przetestowałeś ich zachowanie.
4. Zaimplementuj prymitywną wersję tac w czystym basha jako funkcję rekurencyjną.
TL; DR
Znowu podobało mi się pisanie polecenia Bash tac. Po przeczytaniu mam nadzieję, że zgodzisz się, że jest więcej do taktu, niż myślałeś. Mam nadzieję, że po próbie zrobienia rzeczy na samym dole, wiesz, jak przydatne może być polecenie tac. Jeśli komuś uda się ukończyć któreś z ćwiczeń lub potrzebujesz pomocy w odrabianiu zadań domowych, daj mi znać. Dzięki,