Сохранить выходные данные терминала в файле HTML

Как было указано в комментарии и ответе, проблема заключается в расширении вашего псевдонима.

Но для этого есть решения:

Если вы хотите, чтобы sudoработал со всеми вашими псевдонимами (и таким образом обходил проблему, указанную @Kusalananda ), вы можете добавить следующий псевдоним в свой файл псевдонимов:

alias sudo='sudo '

Если бы вы сделали это, sudo rmбыло бы расширено до sudo trash-put, как вы и ожидали.

Чтобы ответить на комментарий @Dubu о том, что псевдонимы работают только как первое слово команды :, если вы добавите флаг -gв определение псевдонима, он станет глобальным и будет работать, даже если не находится в командной позиции.. Вы могли бы сделать это с вашим псевдонимом rm. Однако вы, вероятно, не хотите иметь другие неприятные сюрпризы с sudo, поэтому первый метод здесь более уместен. Это более актуально, если вы хотите, например, установить псевдоним для передаваемой по каналу команды (, например.alias -g pl='| less').

Что касается расположения корзины при использовании trash-cliс sudo, на это отвечает @Arthur2e5. Я просто могу добавить, что в моем случае это:

/home/.Trash-0

-1
29.05.2021, 22:02
3 ответа

Этот сценарий предполагает, что вы предоставите входные и выходные файлы при его запуске.

#! /bin/bash

INFILE=$1
OUTFILE=$2

echo "<html><head><title>output from csv</title></head><body><table>" > $OUTFILE

while IFS= read -r line
do
  sed -r 's|\s*([0-9]+)\s+(.+)|<tr><td>\1</td><td>\2</td></tr>|' >> $OUTFILE
done < <(cat $INFILE | cut -d, -f 4 | sort | uniq -c | sort -nr)

echo "</table></body></html>" >> $OUTFILE

По сути, вы просто создаете очень простой шаблон HTML и перебираете входные данные. Я использовал sedдля разбора и преобразования входных данных, но это можно сделать множеством способов.

usage: bash./script.sh infile outfile
1
28.07.2021, 11:28

Вы пытаетесь обработать файл CSV (с кавычками и запятыми внутри полей ), как если бы это был простой файл с разделителями -запятыми. Это не сработает. Вам нужно использовать парсер CSV, который понимает поля в кавычках.

Например, для подсчета четвертого столбца с использованием perlи его модуля Text ::CSV с выходным форматом, подобным форматуuniq -c:

#!/usr/bin/perl

use strict;
use Text::CSV;

my $file = shift;  # use first arg as the input filename
my %column;

my $csv = Text::CSV->new({ binary => 1});
open(my $fh, '<', $file) or die "couldn't open $file: $!";

while (my $row = $csv->getline($fh)) {
  # perl arrays start from zero, so row[3] is the fourth field.
  $column{$$row[3]}++;
}
close $fh;

# reverse sort the %column hash by value
foreach my $key (sort { $column{$b} <=> $column{$a} } keys %column) {
  printf "%7i\t%s\n", $column{$key}, $key;
};

Если входной файл содержит какие-либо символы utf -8, измените '<'в операторе open()в строке 10 на'<:encoding(utf8)'

Выход:

$./count.pl file.csv 
      6 Restaurants, bars i hotels (Inclos hostals, pensions i fondes)
      1 Equipament personal
      1 Finances i assegurances
      1 Parament de la llar

Приведенный ниже сценарий использует тот же модуль Text ::CSV для создания минимальной HTML-таблицы, которая выводится на стандартный вывод.

Этот скрипт также использует HTML ::Entities из коллекции модулей HTML ::Parser , чтобы гарантировать, что ничто во входных столбцах не нарушит HTML (, например. Символы <и >должны быть закодированы как &lt;и &gt;, чтобы предотвратить их интерпретацию браузером)

#!/usr/bin/perl

use strict;
use Text::CSV;
use HTML::Entities;

my $file = shift;  # use first arg as the input filename

print "<html>\n<body>\n";
print "<table>\n";

my $csv = Text::CSV->new({ binary => 1});
open(my $fh, '<', $file) or die "couldn't open $file: $!";

while (my $row = $csv->getline($fh)) {
  print '<tr>';
  foreach my $i (@{ $row }) {
    print "<td>". encode_entities($i). "</td>"
  };
  print "</tr>\n";
}
close $fh;

print "</table>\n";
print "</body>\n</html>\n";

Выход:

$./table.pl file.csv 
<html>
<body>
<table>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>Restaurants</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>11</td><td>Finances i assegurances</td><td>Finances i assegurances</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>serveis d&#39;allotjament</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>Bars   / CIBERCAFE</td><td>1</td></tr>
<tr><td>1</td><td>Comer&ccedil; al detall</td><td>4</td><td>Equipament personal</td><td>Cal&ccedil;at i pell</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>Bars   / CIBERCAFE</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>Bars   / CIBERCAFE</td><td>1</td></tr>
<tr><td>1</td><td>Comer&ccedil; al detall</td><td>3</td><td>Parament de la llar</td><td>Mobles i articles fusta i metall</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>Restaurants</td><td>1</td></tr>
</table>
</body>
</html>

Это может быть легко адаптировано для создания таблицы конвейера уценки или таблицы TeX, или любой другой требуемой таблицы.

Примечание :Все упомянутые библиотечные модули доступны для большинства дистрибутивов Linux. Например, в Debian и родственных дистрибутивах их можно установить с помощью sudo apt install libtext-csv-perl libhtml-parser-perl. В противном случае их можно установить с помощью cpan.

1
28.07.2021, 11:28

Вот как получить не -HTML-вывод. Я думаю, вы действительно хотите использовать любой POSIX awk:

$ cat tst.awk
{
    gsub(/^([^,]*,){3}"?|"?(,[^,]*){2}$/,"")
    cnts[$0]++
}
END {
    for (type in cnts) {
        print cnts[type], type
    }
}

$ awk -f tst.awk file
6 Restaurants, bars i hotels (Inclos hostals, pensions i fondes)
1 Finances i assegurances
1 Parament de la llar
1 Equipament personal

Передайте это в sortили используйте GNU awk для sorted_in, если вам небезразличен порядок. Чтобы получить вывод в виде таблицы HTML, будет:

$ cat tst.awk
{
    gsub(/^([^,]*,){3}"?|"?(,[^,]*){2}$/,"")
    cnts[$0]++
}
END {
    print "<html>\n<table>"
    PROCINFO["sorted_in"] = "@val_num_desc"
    for (type in cnts) {
        printf "<tr><td>%s</td><td>%s</td></tr>\n", cnts[type], type
    }
    print "</table>\n</html>"
}

$ awk -f tst.awk file
<html>
<table>
<tr><td>6</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td></tr>
<tr><td>1</td><td>Finances i assegurances</td></tr>
<tr><td>1</td><td>Parament de la llar</td></tr>
<tr><td>1</td><td>Equipament personal</td></tr>
</table>
</html>

и в этом случае вы все еще можете сортировать с помощью sort, изолируя перед сортировкой первые и последние 2 строки, но использовать GNU awk для sorted_inпроще, поэтому на этот раз я включил это в сценарий.

Если вас беспокоят нежелательные символы (&, <или >), появляющиеся во входных данных и нарушающие вывод HTML, просто добавьте это прямо над строкой cnts[$0]++:

gsub(/&/,"\\&amp;"); gsub(/</,"\\&lt;"); gsub(/>/,"\\&gt;")
1
28.07.2021, 11:28

Теги

Похожие вопросы