Чтобы проверить содержимое последней строки каждого файла в текущем каталоге, используйте tail
иgrep
:
for file in *.txt
do
tail -1 -- "$file" | grep -q "must have" || printf '%s\n' "$file"
done
Предполагается, что имена ваших текстовых файлов заканчиваются на .txt
; отрегулируйте этот подстановочный знак по мере необходимости. tail -1
захватывает последнюю строку файла (с поиском назад, что более эффективно, чем потенциальное чтение файла вперед ); эта строка затем направляется в grep
для поиска нужного текста. Флаг -q
для команды grep сообщает ему, что он должен молчать о своей работе, и просто устанавливает соответствующий код возврата. Если grep не не находит совпадение, то чередование ||
"или" указывает оболочке выполнить printf
, которая печатает имя файла.
Вы можете поместить этот код в скрипт или в функцию:
lastlinehas() {
for file in *.txt
do
tail -1 -- "$file" | grep -q "$1" || printf '%s\n' "$file"
done
}
После того, как вы загрузите свой csv в переменную с помощью соответствующегоread_csv
модуля , вы сможете фильтровать и выбирать значения внутри списка с помощью обычных инструментов фильтрации (selectattr
, map
,...)
Для демонстрации я поместил файл выше в files/example.csv
. Тогда следующееplaybook.yml
:
---
- name: Parse csv and filtering demo
hosts: localhost
gather_facts: false
tasks:
- name: read in our csv file in a list
read_csv:
path: files/example.csv
delimiter: ;
register: hosts_info
- name: Show the entire info we parsed (if running with `-v`)
debug:
var: hosts_info.list
verbosity: 1
- name: Show ip depending on fqdn and type
vars:
ip: >-
{{
hosts_info.list
| selectattr('fqdn', '==', item.fqdn)
| selectattr('Typ', '==', item.type)
| map(attribute='IPAddress')
| list
| first
}}
debug:
msg: "The ip of {{ item.fqdn }} for type {{ item.type }} is {{ ip }}"
loop:
- fqdn: aaa.domain.tld
type: db
- fqdn: aaa.domain.tld
type: log
дает (запуск с -v
, чтобы увидеть промежуточную отладку)
$ ansible-playbook playbook.yml
PLAY [Parse csv and filtering demo] ****************************************************************************************************************************************************************************************************
TASK [read in our csv file in a list] **************************************************************************************************************************************************************************************************
ok: [localhost]
TASK [Show the entire info we parsed (if running with `-v`)] ***************************************************************************************************************************************************************************
skipping: [localhost]
TASK [Show ip depending on fqdn and type] **********************************************************************************************************************************************************************************************
ok: [localhost] => (item={'fqdn': 'aaa.domain.tld', 'type': 'db'}) => {
"msg": "The ip of aaa.domain.tld for type db is 10.1.1.1"
}
ok: [localhost] => (item={'fqdn': 'aaa.domain.tld', 'type': 'log'}) => {
"msg": "The ip of aaa.domain.tld for type log is 10.2.2.2"
}
PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0