Мне нужно вырезать определенный текст из файла, чтобы отобразить только определенный столбец, используя скрипт BASH - PullRequest
0 голосов
/ 19 января 2020

У меня есть сценарий bash, который вызывает другой сценарий bash и сохраняет его вывод в текстовом файле. Теперь я хотел бы удалить столбец из этого файла. Например, следующий файл, мне нужно отобразить только столбцы COUNT, CKA CLASS и CKA LABEL и удалить оставшуюся часть раздела. Если я обрежу столбец с помощью awk или sed, он начнет резать из строки провайдера PKCS11

PKCS11 provider found specified slot label: admin (slot: 76147, index: 14)
+-------+-----------------+------------------------------------------------------------------+------------------------------------------------------------------+--------------+-------------+-------------+------------+
| COUNT |    CKA CLASS    |                            CKA LABEL                             |                              CKA ID                              | CKA KEY TYPE | CKA KEY LEN | CKA SUBJECT | CKA ISSUER |
+-------+-----------------+------------------------------------------------------------------+------------------------------------------------------------------+--------------+-------------+-------------+------------+
|   001 | PRIVATE_KEY     | d4a12e598081d863ff371904d42ba6b0d1b19b1f4990477d60sdadafdfdfdffd | c3a12e508081d868c3633c79aa3ff371904d42ba6b0d1b19b1f4040477d6070a | CKK_ECDSA    |           0 |             |            |
|   002 | PUBLIC_KEY      | e5a12g7025l1d868c36331904d42baa6b0d1b19b1ggf4990477dsfdsdfs6070a | d4a12e59891cd868c3633c79aa3ff371904d42b77d6070asfewerww345a122rs | CKK_ECDSA    |           0 |             |            |
+-------+-----------------+------------------------------------------------------------------+------------------------------------------------------------------+--------------+-------------+-------------+------------+

Я хотел бы получить вывод, подобный этому:

PKCS11 provider found specified slot label: admin (slot: 76147, index: 14)
| COUNT |  CKA CLASS  |                            CKA LABEL                             |     
+-------+-----------------+------------------------------------------------------------------+
|   001 | PRIVATE_KEY | ed53bc0ef5cbe3aa0d8994d27dsfdsdfsdfdsf9273f2810defc159e310743d92 |
|   002 | PUBLIC_KEY  | ed53bc0ef5cbe3aa0d8994d27b922ce03dsdfsdd73f2810defc159e310743d92 |  

Ответы [ 2 ]

1 голос
/ 19 января 2020

Вы можете использовать cut дважды:

cut -d"|" -f-4 inputfile | cut -d"+" -f-4

вывод:

PKCS11 provider found specified slot label: admin (slot: 76147, index: 14)
+-------+-----------------+------------------------------------------------------------------
| COUNT |    CKA CLASS    |                            CKA LABEL                             
+-------+-----------------+------------------------------------------------------------------
|   001 | PRIVATE_KEY | d4a12e598081d863ff371904d42ba6b0d1b19b1f4990477d60sdad 
|   002 | PUBLIC_KEY  | e5a12g7025l1d868c36331904d42ba6b0d1b19b1f4990477d6070a 
+-------+-----------------+------------------------------------------------------------------

1 голос
/ 19 января 2020

Простой способ подойти к этому - избавиться от ненужных строк с помощью sed, а затем просто распечатать первые 94 символов оставшихся строк, например,

$ while read line; do echo "${line:0:94}"; done < <(sed '2d;$d' file)
PKCS11 provider found specified slot label: admin (slot: 76147, index: 14)
| COUNT |    CKA CLASS    |                            CKA LABEL                             |
+-------+-----------------+------------------------------------------------------------------+
|   001 | PRIVATE_KEY     | d4a12e598081d863ff371904d42ba6b0d1b19b1f4990477d60sdadafdfdfdffd |
|   002 | PUBLIC_KEY      | e5a12g7025l1d868c36331904d42baa6b0d1b19b1ggf4990477dsfdsdfs6070a |

( примечание: если вы не используете bash, где замена процесса доступна для подачи while l oop, вы можете просто вызвать выражение sed сначала и передайте результат в while l oop.)


Редактировать на основе комментария

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

$ width=$(awk -F'|' '{print length($2)+length($3)+length($4)+4}' < <(sed -n 3p file))
  while read line; do
      echo "${line:0:$width}"
  done < <(sed '2d;$d' file)
PKCS11 provider found specified slot label: admin (slot: 76147, index: 14)
| COUNT |    CKA CLASS    |                            CKA LABEL                             |
+-------+-----------------+------------------------------------------------------------------+
|   001 | PRIVATE_KEY     | d4a12e598081d863ff371904d42ba6b0d1b19b1f4990477d60sdadafdfdfdffd |
|   002 | PUBLIC_KEY      | e5a12g7025l1d868c36331904d42baa6b0d1b19b1ggf4990477dsfdsdfs6070a |

Еще один немного более короткий способ, который устраняет while l oop и использует cut, чтобы обрезать до объединенной ширины первых 3 полей с разделителями может быть:

$ width=$(awk -F'|' '{print length($2)+length($3)+length($4)+4}' < <(sed -n 3p file))
sed '2d;$d' file | cut -c -$width
PKCS11 provider found specified slot label: admin (slot: 76147, index: 14)
| COUNT |    CKA CLASS    |                            CKA LABEL                             |
+-------+-----------------+------------------------------------------------------------------+
|   001 | PRIVATE_KEY     | d4a12e598081d863ff371904d42ba6b0d1b19b1f4990477d60sdadafdfdfdffd |
|   002 | PUBLIC_KEY      | e5a12g7025l1d868c36331904d42baa6b0d1b19b1ggf4990477dsfdsdfs6070a |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...