2016-01-23 3 views
2

У меня есть простой сценарий оболочки, как показано ниже, и я хочу поместить разрыв строки после каждой возвращаемой им строки.awk line break with printf

#!/bin/bash 
vcount=`db2 connect to db_lexus > /dev/null; db2 list tablespaces | grep -i "Tablespace ID" | wc -l` 
db2pd -d db_lexus -tablespaces | grep -i "Tablespace Statistics" -A $vcount | awk '{printf ($2 $7)}' 

Выход:

Statistics:IdFreePgs0537610230083224460850d 

и я хочу выход быть что-то вроде этого:

Statistics: 
Id FreePgs 
0 5376 
1 0 
2 3008 
3 224 
4 608 
5 0 

Это можно сделать с помощью сценариев оболочки?

+0

Все возможно с помощью сценариев оболочки. Попробуйте 'import antigravity' в python некоторое время. –

ответ

2

Похоже, вы просто хотите напечатать столбцы 2 и 7 того, что передано AWK. Попробуйте изменить команду AWK на

awk '{print $2, $7}' 

Это также добавит разрыв линии в конце.

+0

Большое вам спасибо. Как я уже говорил, у меня нет большого опыта работы с Shell Scripting. Меня устраивает. –

2

Ваша задача может быть сведена к следующему:

$ cat infile 
11 12 
21 22 
$ awk '{ printf ($1 $2) }' infile 
11122122 

printf для отформатированных печати. Я даже не уверен, определено ли поведение вышеприведенного использования, но это не так, как это должно быть сделано. Рассмотрим:

$ awk '{ printf ("%d %d\n", $1, $2) }' infile 
11 12 
21 22 

"%d %d\n" является выражением, которое описывает, как формат вывода: «десятичное целое число, пробел десятичное целое число и символ новой строки», за которым следуют цифры, которые идут туда, где %d есть. printf очень гибкий, см. manual за то, что он может сделать.

В этом случае, мы на самом деле не нужна сила printf, мы можем просто использовать print:

$ awk '{ print $1, $2 }' infile 
11 12 
21 22 

Это печатает первое и второе поле, разделенные пробелом – и printделает Добавить новую строку, не говоря нам.

Более точно, «отделены друг от друга значением выходного поля сепаратора OFS», который по умолчанию в пространстве и печатается там, где мы используем , между двумя аргументами. Забытие запятой является популярной ошибкой, которая не приводит к пробелу между полями записи.

+0

Бенджамин, спасибо за ваше объяснение относительно правильного использования команды awk и print. и вы, и e0k, помогите мне. Это просто изменение в моем скрипте, которое позволяет получить именно то, что я хотел. –

1

Я понимаю, что вы спрашиваете о том, как сделать что-то в сценарии оболочки, но это, несомненно, будет намного легче, чтобы получить это из базы данных с помощью SQL:

#!/bin/bash 

export DB2DBDFT=db_lexus 

db2 "select tbsp_id, tbsp_free_pages \ 
     from table(mon_get_tablespace('',-2)) as T \ 
    order by tbsp_id" 
+0

Ян, ты совершенно прав. Я мог бы выполнить простой запрос в функции таблицы mon_get_tablespace и получить tbspid и tbsp_free_pages, но поскольку я никогда не умел писать сценарии оболочки, мне нужно было улучшить свои знания в сценариях оболочки. Спасибо. –