GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Anzahl der von Ls ausgegebenen Zeilen?

Wenn ls aufgerufen wird, gibt es alle Dateien/Verzeichnisse im aktuellen Verzeichnis aus und versucht, so viele wie möglich in jede Zeile zu passen. Warum ist das so, wenn es an wc -l übergeben wird , es gibt die Anzahl der Dateien aus? Wie entscheidet es, in wie vielen Zeilen seine Ergebnisse ausgegeben werden?

Akzeptierte Antwort:

Wenn ls ausgeführt wird, analysiert es verschiedene Optionen. Es erkennt auch, ob die Ausgabe ein tty ist oder nicht durch isatty().

ls.c:

Code

case LS_LS:
  /* This is for the `ls' program.  */
  if (isatty (STDOUT_FILENO))
    {
      format = many_per_line;
      /* See description of qmark_funny_chars, above.  */
      qmark_funny_chars = true;
    }
  else
    {
      format = one_per_line;
      qmark_funny_chars = false;
    }
  break;

Code

      /* disable -l */
      if (format == long_format)
        format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);

usw.

Wenn Sie möchten, können Sie einen einfachen Test kompilieren:

isawhat.c

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    if (isatty(STDOUT_FILENO)) {
        fprintf(stdout, "Word by word my world.n");
    } else {
        fprintf(stdout, "HELP! Stranger handling my words!!n");
    }

    fprintf(stderr, "Bye bye.n");

    return 0;
}

Kompilieren durch:

gcc -o isawhat isawhat.c

Dann z.B.:

$ ./isawhat | sed 's/word/world/'

Die Breite wird in Spalten gemessen. Eine Spalte ist ein Zeichen. Es beginnt mit 80, dann prüfen Sie, ob die Umgebungsvariable COLUMNS gesetzt ist und eine gültige Ganzzahl enthält, die nicht größer als SIZE_MAX ist (was vom Arch abhängig ist – Ihr Terminal wird niemals so breit sein (zumindest noch nicht)).

Versuchen Sie z. echo $COLUMNS . Es spiegelt höchstwahrscheinlich die Anzahl der Spalten wider, die Sie im Fenster zur Verfügung haben. Wenn die Größe des Fensters geändert wird, wird dies aktualisiert. Es wird höchstwahrscheinlich auch durch verschiedene Befehle zurückgesetzt.

Eine Möglichkeit, es etwas schwieriger einzustellen, ist stty . Z.B. stty columns 60 . Verwenden Sie stty -a um alle anzuzeigen (man stty). Ein lustiges Stück Software.

Wenn darin einkompiliert, auch Abfrage nach Spalten durch ioctl(), Erkennung der Fenstergröße. Durch Übergabe der Dateinummer für stdout an ioctl und Übergeben der Anfrage TIOCGWINSZ der Struktur winsize mit der Anzahl der Spalten gefüllt werden.

Dies kann auch durch einen einfachen C-Code demonstriert werden:

Fenster kompilieren, ausführen und Größe ändern. Sollte aktualisieren. Strg+C zum Beenden.

#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <signal.h>

static int run;

void sig_handler(int sig) {
    switch (sig) {
    case SIGINT:
    case SIGTERM:
    case SIGSTOP:
        run = 0;
        break;
    }
}

void sig_trap(int sig) {
    if ((signal(sig, sig_handler)) == SIG_IGN)
        signal(sig, SIG_IGN);
}

int main(void)
{
    struct winsize ws;

    sig_trap(SIGINT);
    sig_trap(SIGTERM);
    sig_trap(SIGSTOP);

    run = 1;
    while (run) {
        if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) {
            fprintf(stdout, "r %s: %3d, %s: %dr",
                "Columns", ws.ws_col,
                "Rows", ws.ws_row
            );
            fflush(stdout);
        }
        usleep(5000);
    }
    fprintf(stdout, "n");

    return 0;
}

Linux
  1. Ermitteln Sie die Anzahl der Codezeilen aus dem GitHub-Repository

  2. Wie finde ich die Anzahl der im Terminal verfügbaren vertikalen Linien?

  3. Datei nach Anzahl der Zeilen aufteilen, einschließlich Header in jeder Zeile?

  4. Wie drucke ich die Zeilen Nummer 15 und 25 von jeweils 50 Zeilen?

  5. Wie zähle ich die Anzahl der Zeilen in einer Datei nach einem Grep-Match?

Wc-Befehl in Linux (Anzahl der Zeilen, Wörter und Zeichen zählen)

Linux WC-Befehl zum Zählen der Anzahl der Zeilen, Wörter und Zeichen

5 Möglichkeiten, die Anzahl der Zeilen in einer Datei zu zählen

Beispiele für WC-Befehle:Zählen Sie die Anzahl der Zeilen, Wörter und Zeichen in Linux

Wie zähle ich die Gesamtzahl der Zeilen der gefundenen Dateien?

Zeichnen Sie zufällig eine bestimmte Anzahl von Linien aus einer Datendatei