Параллелизм поиска, хэш-значения и замены в большом количестве строк

Прочитав комментарии telcoM и покопавшись в журналах и справочных страницах, я теперь могу ответить на свой вопрос.

По какой-то причине информация о VG, к которой принадлежит PV /dev/sdc, была потеряна во время перезагрузки и больше не возвращалась.

Я не совсем понимаю решение (возможно, кто-то, кто понимает, может добавить некоторые детали ),но сработало следующее. Первый

> vgscan --cache
  Found volume group "r3vg" using metadata type lvm2

возвращает мою конфигурацию VG. Теперь PV снова известен

> pvs
  /dev/sdc   r3vg    lvm2 a--   72.76t 26.39t

LV также снова известен, но неактивен

> lvscan
   inactive          '/dev/r3vg/p0' [46.37 TiB] inherit

И, наконец,

> lvchange -ay r3vg/p0

возвращает его.

Почему при перезагрузке не подхватывается конфигурация ВГ мне непонятно. Если у кого-то есть какие-либо предложения, добавьте их в комментарии, пожалуйста.

4
10.12.2020, 20:59
2 ответа

FWIW Я думаю, что это самый быстрый способ сделать это в сценарии оболочки:

$ cat tst.sh
#!/usr/bin/env bash

for file in "$@"; do
    while IFS='"' read -ra a; do
        sha=$(printf '%s' "${a[1]}" | sha1sum)
        sha="${sha% *}"
        printf '%s"%s"%s"%s"%s"%s"%s"\n' "${a[0]}" "$sha" "${a[2]}" "${a[3]}" "${a[4]}" "$sha" "${a[6]}"
    done < "$file"
done

$./tst.sh file

$ cat file
"e8bb6adbb44a2f4c795da6986c8f008d05938fac" : ["200000", "e8bb6adbb44a2f4c795da6986c8f008d05938fac"]"
"aaac41fe0491d5855591b849453a58c206d424df" : ["200000", "aaac41fe0491d5855591b849453a58c206d424df"]"

но, как я упоминал в комментариях, для скорости выполнения лучше использовать инструмент со встроенной функциональностью sha1sum, например. питон.

5
18.03.2021, 22:43

По совету Эда Мортона, с небольшой помощью Python.

Создайте скрипт Python /tmp/sha1.py и сделайте его исполняемым

#! /usr/local/bin/python -u

import hashlib
import sys

for line in sys.stdin:
  words = line.split()
  str_hash=hashlib.sha1(words[0].encode())
  words[0] = str_hash.hexdigest()
  print(" ".join(words))

Первая строка должна содержать правильное местоположение вашего питона, но не удаляйте «-u».

Затем ksh-скрипт, который тоже нужно сделать исполняемым.

#! /usr/bin/ksh

/tmp/sha1.py |&

for y in files*
do
  while read A B
  do
    eval "echo $A" >&p
    read A <&p
    echo \"$A\" $B
  done < $y > TMP.$y
  mv TMP.$y $y
done

# terminate sha1.py
exec 3>&p
exec 3>&-

Теперь, если вам нужна производительность, вы должны позволить python обрабатывать сразу весь файл. Следующие скрипты обрабатывают каждую строку ввода как имя файла и выполняют вашу грязную работу:

#! /usr/local/bin/python

import hashlib
import os
import sys

for IFileNmX in sys.stdin:
  IFileNm = IFileNmX.strip()
  IFile = open(IFileNm,'r')
  OFileNm = ".".join(["TMP",IFileNm])
  OFile = open(OFileNm,'w')
  for line in IFile.readlines():
    words = line.split()
    word1 = words[0].strip('"')
    str_hash=hashlib.sha1(word1.encode())
    words[0] = "".join(['"',str_hash.hexdigest(),'"'])
    OFile.write("".join([" ".join(words),'\n']))
  OFile.close()
  IFile.close()
  os.rename(OFileNm,IFileNm)

Если вы назовете этот скрипт /tmp/sha1f.py и сделаете его исполняемым, интересно, сколько минут

ls files* | /tmp/sha1f.py

возьмет. Моей системе потребовалось 12 секунд, чтобы обработать 400-мегабайтный файл из миллиона строк. Но это хвастовство, конечно.

3
18.03.2021, 22:43

Теги

Похожие вопросы