Nova pergunta em 22.9.2016, abaixo!
Meu caminho é assim:
~/Desktop/logs
├── first_folder
| ├── 11.11 (folder)
│ | ├── access_log
│ | ├── access_log.1.gz
│ | :
│ | └── access_log.40.gz
| └── 11.12 (folder)
│ ├── access_log
│ ├── access_log.1.gz
│ :
│ └── access_log.16.gz
├── second_folder (folder)
| ├── 31.11 (folder)
│ | ├── access_log
│ | ├── access_log.1.gz
│ | :
│ | └── access_log.20.gz
| └── 31.15 (folder)
│ ├── access_log
│ ├── access_log.1.gz
│ :
: └── access_log.38.gz
└── last_folder
├── 91.11 (folder)
| ├── access_log
| ├── access_log.1.gz
| :
| └── access_log.25.gz
└── 91.15 (folder)
├── access_log
├── access_log.1.gz
:
└── access_log.30.gz
De todos os logs, tenho que extrair os dados que contêm string: /Jan/2016
Pergunta # 1
Como posso obter todos os registros de todos os arquivos em todas as pastas e salvá-los como single_file.txt
Editar # 1
Resposta possível:
$ find . -name \*.* | xargs -0 zgrep -E '/Jan/2016' > single_file.txt
O arquivo é realmente muito grande, muito GB.
Saída:
single_file.txt
./first_folder/11.11/access_log.9.gz: ... text ...
./first_folder/11.12/access_log.9.gz: ... text ...
./second_folder/31.11/access_log.9.gz: ... text ...
./second_folder/31.11/access_log.9.gz: ... text ...
:
Pergunta # 2
Como posso obter todos os registros de todos os arquivos em todas as pastas e salvá-los individualmente, dependendo dos registros que eu pegar de first_folder, second_folder etc, como first.txt, second.txt
.
A saída seria algo como:
first.txt
./first_folder/11.11/access_log.9.gz: ... text ...
./first_folder/11.12/access_log.9.gz: ... text ...
:
second.txt
./second_folder/31.11/access_log.9.gz: ... text ...
./second_folder/31.15/access_log.9.gz: ... text ...
:
Pergunta # 3
Como posso obter uma lista de todos os arquivos que contêm a string /Jan/2016
?
Se eu usar este comando, ele recuperará todos os arquivos:
$ find ~/Desktop/logs/ -type f | xargs zgrep -l "/Jan/2016"
Saída:
Terminal
/home/name/Desktop/logs/first_folder/11.11/access_log.9.gz
/home/name/Desktop/logs/first_folder/11.12/access_log.8.gz
/home/name/Desktop/logs/second_folder/31.11/access_log.6.gz
:
Editar # 2
@ código do waltinator e correção do @ Zanna-s:
pushd ~/Desktop/logs
for dir in * ; do
if [[ -d "$dir" ]] ; then
outname="$dir.txt"
find "$dir" -type f -print0 | xargs -0 zgrep -l '/Jan/2016' >"$outname"
fi
done
popd
me dará a estrutura:
~/Desktop/logs
├── first_folder
| └── first.txt
├── second_folder
| └── second.txt
:
└── last_folder
└── last.txt
onde first.txt-last.txt
conterá caminhos para arquivos específicos que contenham string / Jan / 2016.
first.txt
first_folder/11.11/access_log.9.gz
first_folder/11.11/access_log.8.gz
first_folder/11.12/access_log.9.gz
first_folder/11.12/access_log.8.gz
Pergunta # 4 (22.9.2016)
Eu precisava modificar /Jan/2016
para um determinado período de tempo ... por exemplo, 1/Nov/2014-31/Apr/2015
so em um código que o @Zana forneceu em vez do /Jan/2016
que usei /(Nov|Dec)/2014|/(Jan|Feb|Mar|Apr)/2015
.
Aviso é lançado:
xargs: Warning: a NUL character occurred in the input. It cannot be passed through in the argument list. Did you mean to use the --null option?
Todos os resultados não são retornados nos arquivos criados, embora todos os arquivos sejam criados.