Как получить вывод в табличном формате из сценариев оболочки?

Вы можете передавать команды gdb в командной строке с опцией -ex. Вам нужно повторить это для каждой команды. Это может быть полезно, когда вашей программе нужно прочитать стандартный ввод, поэтому вы не хотите его перенаправлять. Например, дляod -c

echo abc |
gdb -ex 'break main' -ex 'run -c' -ex bt -ex cont -ex quit  od

Так что, в частности, для вашего вопроса вы можете использовать:

gdb -ex 'run arg1 arg2' -ex bt -ex quit./program
1
30.07.2020, 11:23
6 ответов

Вы можете использовать команды awkи column, например:

awk -F'/' 'BEGIN{print "PathName FileName"}{a="";for(i=2;i<=NF-1;i++){a=a"/"$i};a=a"/";print a"\t"$NF}' file_name  | column -t

Будет напечатано как:

PathName                                                  FileName
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/  text1.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/  text2.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/EMP2/      text3.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/ACS1/      text4.txt

Если вы хотите сохранить пробелы между словами Path Name and File Name, вы можете разделить их табуляцией вместо пробела.

awk -F'/' 'BEGIN{print "         Path Name\tFile Name"}{a="";for(i=2;i<=NF-1;i++){a=a"/"$i};a=a"/";print a"\t"$NF}' file_name  | column -t -s $'\t'
         Path Name                                        File Name
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/  text1.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/  text2.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/EMP2/      text3.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/ACS1/      text4.txt
2
18.03.2021, 23:16

только ksh (напр. printf — это оболочка, построенная -в )

.
# find the longest path name
MP=0
while read
do
  P="${REPLY%/*}"
  PS=${#P}
  [ $PS -le $MP ] || MP=$PS
done < /tmp/test.txt

# calculate where to put "Path Name"
(( MP++ ))
T="Path Name"
TS=${#T}
(( SS = ( MP - TS ) / 2 ))
(( SP = ( MP - TS ) % 2 ))
printf "%${SS}s%s%${SS}s%${SP}s %s\n" "" "$T" "" "" "File Name"

# format the input text
while read
do
  P="${REPLY%/*}"
  F="${REPLY##*/}"
  printf "%-${MP}s %s\n" "$P/" "$F"
done < /tmp/test.txt

Вы можете понять, почему некоторые слабонервные возвращаются к использованию команд POSIX.

0
18.03.2021, 23:16

Используя Perl + column, вы можете запустить что-то вроде

perl -pE 'BEGIN{say "Path\tFile\n"} s!.*/\K!\t!' input | column -t
0
18.03.2021, 23:16

Мы можем использовать tbl, groff, который является адаптацией GNU nroff, и построчный редактор ed.

Сначала мы разбиваем каждую строку на имя каталога и базовое имя, а затем вставляем tblкод в начало и конец файла. Код таблицы предназначен для центрирования столбцов заголовков и выравнивания по левому краю остальных.

Утилита tblвыдает рабочий код groff, который groffзатем работает с ним, чтобы получить желаемый результат. grepудаляет пустые строки.

$ ed -s inp <<\eof | tbl | groff -Tascii | grep.
,s|[^/]*$|@&|
1i
.TS
tab(@);
c c
l l.
PATH NAME@FILE NAME
.
$a
.TE
.
,p
Q
eof

Выход:

                       PATH NAME                           FILE NAME
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/   text1.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/   text2.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/EMP2/       text3.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/ACS1/       text4.txt
0
18.03.2021, 23:16

Если ваш источник действительно является этим файлом, вы можете сделать это следующим образом:

(echo full_path; cat input) | 
  csv-add-split -c full_path -e / -n parent,name -r |
  csv-cut -c parent,name -S

Но если ваш источник представляет собой путь к каталогу, вы можете сделать это следующим образом:

csv-ls -R -c parent,name /gpfs/pcenterdata/test/SrcFiles -S

Эти команды поступают из инструментов csv -nix -(https://github.com/mslusarz/csv-nix-tools).

0
18.03.2021, 23:16

Подобно Prvt _Yadav, вы можете использовать awk & column, но для извлечения необходимого текста можно использовать функцию awk "gensub".

awk 'BEGIN{print "PathName\tFileName"} {f=gensub(/.*\//,"\\1","1"); p=gensub(/[^/]*$/,"\\1","1"); print p"\t"f}' | column -t
0
18.03.2021, 23:16

Теги

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