ファイルの文字列行から最初の数値セットのみを抽出する正規表現

ファイルの文字列行から最初の数値セットのみを抽出する正規表現

正規表現を使用してファイルの文字列行から最初の数値セット/セットを抽出する方法行を無視2つの数値セット、すべての記号(PASS_MAX_DAYSを除く)があり、端末に表示されます。ファイル(login.defs)が変更されていません。

例(太字のみ)

PASS_MAX_DAYS30

PASS_MAX_DAYS 30.12(無視)

PASS_MAX_DAYS $30 (無視)

PASS_MAX_DAYS 30 23(無視)

PASS_MAX_DAYS 30日(無視)

PASS_MAX_@30日目(無視)

- name: extract num from pass max days
  hosts: localhost
  tasks:
    - lineinfile:
        path: /etc/login.defs
        state: absent
        regexp: '(?i)^\s*PASS_MAX_DAYS\s+[0-9]+\s*$'
      check_mode: yes
      register: days

    - name: show password max days
      debug:
        msg: "{{days}}" #Show max days
      when: days <= 90

ベストアンサー1

与えられたファイル

shell> cat /tmp/login.defs 
PASS_MAX_DAYS 30
PASS_MAX_DAYS 30 .12
PASS_MAX_DAYS $30
PASS_MAX_DAYS 30 23
PASS_MAX_DAYS 30 days
PASS_MAX_@DAYS 30

ファイルを読む

    - command: cat /tmp/login.defs
      register: out

たとえば、Playbook変数に次の宣言を入力します。

regexp: '(?i)^\s*PASS_MAX_DAYS\s+[0-9]+\s*$'
pass_max_days: "{{ out.stdout_lines|
                   select('match', regexp)|first|split|last }}"

与えられた

pass_max_days: '30'

テストのための完全なプレイブックの例

- hosts: localhost
  vars:
    regexp: '(?i)^\s*PASS_MAX_DAYS\s+[0-9]+\s*$'
    pass_max_days: "{{ out.stdout_lines|
                       select('match', regexp)|first|split|last }}"
  tasks:
    - command: cat /tmp/login.defs
      register: out
    - debug:
        var: pass_max_days

尋ねる:「日数をどのように比較しますか?」

A:整数に変換してください。例えば

    - debug:
        msg: Less than 90 days
      when: pass_max_days|int < 90
    - debug:
        msg: Exactly 90 days
      when: pass_max_days|int == 90
    - debug:
        msg: More than 90 days
      when: pass_max_days|int > 90

与える

TASK [debug] *******************************************************
ok: [localhost] => 
  msg: Less than 90 days

TASK [debug] *******************************************************
skipping: [localhost]

TASK [debug] *******************************************************
skipping: [localhost]

おすすめ記事