Schwanz- und Platzhalterzeichen

9

Ich möchte die letzten 10 Zeilen mehrerer Dateien erhalten. Ich weiß, dass sie alle mit "-access_log" enden. Also habe ich versucht:

 tail -10 *-access_log 

Aber das gibt mir einen Fehler, wo als:

tail -10 file-*

Gibt mir die Ausgabe, die ich erwarten würde. Ich würde denken, dass dies wahrscheinlich mehr mit BASH als mit Schwanz zu tun hat. Befehle wie:

cat *-access_log

Funktioniert gut.

Irgendwelche Vorschläge?

Mitch
quelle

Antworten:

9

Ich glaube, Sie würden wollen:

tail -n 10 *-access.log

Was , warum :
Ich glaube nicht , dass irgendetwas mit Globbing zu tun hat:

tail -10 foo-access.log arf-access.log 
tail: option used in invalid context -- 1

Ich denke, es kommt einfach so vor, dass Ihr Glob auf eine Datei erweitert wird. Es hat wahrscheinlich etwas mit einigen archaischen Optionen zu tun, die analysiert werden. Ich bin zu faul, um sie zu lesen, aber wenn Sie es wirklich wissen wollen, schauen Sie tail.cin die Quelle von coreutils und analysieren Sie die folgende Funktion:

parse_obsolete_option (int argc, char * const *argv, uintmax_t *n_units)
Kyle Brandt
quelle
oder tail -n 10 * -access.log danke für die superschnelle Antwort !!
Mitch
Ja, wirklich, Sie brauchen nicht einmal die 10, weil das die Standardeinstellung ist.
Kyle Brandt
Zu Ihrer Information, es scheint, dass es mit Globbing zu tun hat (bitte lesen Sie meine Antwort)
e2-e4
6

Die Frage ist zwar etwas alt, aber immer noch relevant. Ich bin auf ein ähnliches Problem gestoßen

ssh myserver.com 'tail -2 file-header*'

das gab mir den Fehler

tail: Option in ungültigem Kontext verwendet - 2

jedoch Tailing nur eine Datei, wie

ssh myserver.com 'tail -2 file-header-file-one'

funktioniert gut. Mit Blick auf die Quelle tail.c zeigt , dass Schwanz startet durch Parsen veraltete Optionen, dann den Rest analysieren (dh Optionen noch nicht verarbeitet), regelmäßige Optionen. Allerdings parse_obsolete_option()erwartet ein „veralteter“ usage, mit nur einer Datei als Argument.
Wenn Sie also mehr Dateien bereitstellen, kehrt die Funktion sofort zurück und lässt den regulären Parser ersticken -2(erwartet -n 2).

  /* With the obsolete form, there is one option string and at most
     one file argument.  Watch out for "-" and "--", though.  */
  if (! (argc == 2
         || (argc == 3 && ! (argv[2][0] == '-' && argv[2][1]))
         || (3 <= argc && argc <= 4 && STREQ (argv[2], "--"))))
    return false;

Zusammenfassend ist es besser, immer die -nreguläre Form zu verwenden, da der "veraltete" Code nur eine Datei akzeptiert.

e2-e4
quelle
2
Ich liebe es, dass du in die Quelle gegraben und die Grundursache für dieses Problem gefunden hast! Aber ja, abschließend, verwenden Sie -n 2statt, -2wenn es Platzhalter gibt.
ADTC