Вы можете сделать что-нибудь вроде
tar tf thefile.tar | cut -d/ -f1 | sort -u
, чтобы увидеть, какие записи верхнего уровня есть в tar; по каналу wc -l
, чтобы проверить, есть ли их больше одного. Обратите внимание, что есть несколько случаев, когда это не сработает, например если tar содержит пути к файлам в форме somedir / something
, а также ./ somedir / something
(или что-то более безумное); Однако это должно быть необычным.
Это будет читать весь tar-файл перед выводом чего-либо из-за сортировки
, хотя это должно быть быстрее, чем фактическое извлечение, потому что это всего лишь одно последовательное чтение, и оно может пропускать большие файлы.
Если вы делаете это в интерактивном режиме и файл может быть большим, вы можете изменить sort -u
на uniq
и Control + C , если он распечатывает более одного объекта.
Dada la variable de shell num
establecida igual a335
:
grep -A1 "\"id\" : $num," /path/to/file
Saco mucho provecho de las prácticas opciones -A
, -B
y -C
de grep
, los mnemotécnicos que utilizo son "Después", "Antes" y "Contexto".
grep -A n 'pattern' file
mostrará las n líneas A después de una coincidencia de patrón, además de la propia línea coincidente.
grep -C n 'pattern' file
mostrará las n líneas B antes de una coincidencia de patrón, además de la propia línea coincidente.
grep -C n 'pattern' file
mostrará las líneas n antes de y después de (i. mi. el C ontext de )una coincidencia de patrón, además de la propia línea coincidente.
awk '/"id" : 335/{getline;print}'
o
var="\"id\" : 335"
awk "/$var/{getline;print}"
o
awk -v var="\"id\" : 335" '$0~var{getline;print}'
o
var="\"id\" : 335"
awk -v var="$var" '$0~var{getline;print}'
o cualquiera de los anteriores, pero sin necesidad de la parte "id" : "
de la cadena, en la forma:
awk -v var="335" '$0~"id" : var{getline;print}'
Suponiendo que el archivo JSON es una gran matriz de objetos como
{
"href": "http://localhost:8080/api/v1/clusters/sys41/requests/333",
"Requests": { "id": 333, "cluster_name": "sys41", "request_status": "COMPLETED" }
},
(observando que las líneas nuevas no son significativas, y tampoco lo es el orden de las claves en un objeto )entonces, el siguiente comando jq
obtendría la entrada request_status
para el id
correspondiente a$num
:
$ num=355
$ jq -r ".[].Requests | select(.id == $num).request_status" file.json
FAILED
Hace esto seleccionando todas las entradas Requests
de cada objeto y filtrándolas en id
. Para los que pasan el filtro, extrae request_status
.
La opción -r
a jq
hace que genere datos sin procesar en lugar de JSON(FAILED
habría estado entre comillas dobles sin él ).
Material adicional:
$ jq -r '.[].Requests | "\(.id): \(.request_status)"' file.json
333: COMPLETED
334: FAILED
335: FAILED
336: COMPLETED