Bash 스크립트를 읽는 속도를 높일 수 있습니까?

Bash 스크립트를 읽는 속도를 높일 수 있습니까?

저는 아직 전체 Linux bash 스크립팅에 대해 매우 익숙하지 않습니다. 이 코드를 알아냈지만 불행히도 작은 파일(193KiB)을 실행하는 데 약간의 시간이 걸립니다.

real 0m7.234s user 0m6.772s sys 0m3.486s

살펴보시고 개선 사항이나 팁을 제공해 주시면 매우 감사하겠습니다!

#!/bin/bash
#
while read line; do
    RNAME=$(echo $line | grep -w "ET CINS Active Threat Intelligence Poor Reputation" | sed 's/^.*\(ET CINS Active Threat Intelligence Poor Reputation.*\)/\1/g' | sed 's/".*//') 
    RSID=$(echo $line | grep -w "ET CINS Active Threat Intelligence Poor Reputation" | grep -o "sid:.*" | awk '{print $1}' | rev | cut -c 2- | rev | cut -c 5-)
    echo $line | grep -w "ET CINS Active Threat Intelligence Poor Reputation" | awk '{print  "'"$RSID"'" " " "\"[;][)]\"" " " "\"" "; fwsam: src[either], 1 hour;)\"; # " "'"$RNAME"'" }'#  >> /tmp/snortsam-rules.txt
    echo $line | grep -w "ET CINS Active Threat Intelligence Poor Reputation" | awk '{print  "'"$RSID"'" " " "\"\\(msg:\"\" \"(msg:\"[SNORTSAM] \"; # " "'"$RNAME"'" }'  >> /tmp/snortsam-rules.txt
done < /etc/snort.d/rules/emerging-threats/emerging-ciarmy.rules

파일 내용을 입력하세요.

alert tcp [1.11.244.148,1.119.129.16,1.119.133.214,1.119.144.196,1.163.25.190,1.170.159.97,1.173.65.136,1.177.142.203,1.177.220.170,1.177.251.214,1.180.189.18,1.180.208.131,1.180.208.132,1.180.233.23,1.186.176.220,1.186.176.246,1.186.220.92,1.186.235.187,1.192.123.218,1.192.145.246,1.202.225.53,1.202.65.39,1.215.230.46,1.221.225.138,1.228.102.199,1.230.44.160,1.232.113.151,1.234.1.70,1.234.4.14,1.239.35.88,1.24.156.110,1.245.107.90,1.247.184.111,1.251.177.206,1.253.135.172,1.254.20.189,1.254.47.75,1.28.202.11,1.28.202.16,1.31.87.35,1.32.200.123,1.32.216.88,1.32.47.74,1.33.73.100,1.34.113.192,1.34.158.177,1.34.209.99,1.34.21.27,1.34.2.152,1.34.28.244] any -> $HOME_NET any (msg:"ET CINS Active Threat Intelligence Poor Reputation IP TCP group 1"; flags:S; reference:url,www.cinsscore.com; reference:url,www.networkcloaking.com/cins; threshold: type limit, track by_src, seconds 3600, count 1; classtype:misc-attack; sid:2403300; rev:40471;)

출력 샘플 코드:

2403300 "[;][)]" "; fwsam: src, 1 hour;)"; # ET CINS Active Threat Intelligence Poor Reputation IP TCP group 1

기본적으로 내가 원하는 것은 위의 출력 예제 코드와 같이 입력의 일부를 가져와서 파일에 저장하는 것입니다.

답변1

노트:

  1. 파일에서 개별 줄을 읽고 각 줄에서 여러 프로그램을 여러 번 실행하면 속도가 매우 느려집니다.
  2. 각 실행에 대해서는 위를 참조하세요 echo $line | ....

이 중 대부분은 awk 자체로 수행할 수 있습니다.

awk -v fmt1='%s "[;][)]" "; fwsam: src, 1 hour;)"; # %s\n' -v fmt2='%s "\\(msg:"" "(msg:"[SNORTSAM] "; # %s\n' '/ET CINS Active Threat Intelligence Poor Reputation/ {
  rname = gensub(/.*(ET CINS Active Threat Intelligence Poor Reputation [^"]*).*/, "\\1", 1)
  rsid = gensub(/.*ET CINS Active Threat Intelligence Poor Reputation.*sid:(.*); .*/, "\\1", 1)
  printf fmt1, rsid, rname
  printf fmt2, rsid, rname
}' input-file

노트:

  1. 특정 출력 형식을 얻기 위해 복잡한 이스케이프를 수행하는 대신 다음을 사용하십시오.printf형식 문자열 포함. 외부에서 정의된 두 개의 awk 변수( -v fmt1=..., )를 형식 문자열로 사용하여 -v fmt2=...많은 인용을 피했습니다.
  2. echo ... | grep ... | awk패턴이 일치하는 경우 에만 인쇄하곤 했습니다 . 이는 패턴과 일치하는 행에서만 Run 작업을 사용하여 grepawk 자체 내에서 쉽게 수행할 수 있습니다 ./pattern/ { action }
  3. 및 명령의 작업은 정규식으로 쉽게 수행됩니다 rev | cut | rev | cut. sed ... | sed필요한 문자 그룹을 유지하기만 하면 됩니다.

관련 정보