Linux 시스템에 다음 텍스트가 포함된 파일이 있습니다. 또는를 title AHS - abc Linux Servers사용하여 sed문자열을 검색 awk한 다음 일치 항목 뒤의 두 번째 줄에 새 항목을 추가 해야 합니다 .

#
# AHS - ABC Linux CBTS 
#
subparent AHS_ABC_NIX AHS_abct_NIX_CIN CBTS
title AHS - abc  Linux Servers <---this is what I want to search in text file
group-sorted
>---here I need to add the new entry---<
10.34.73.111     lkut            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.34.73.111     lkut0            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.10.10.10      lkut1          # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.10.10.10     lkut2           # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.10.10.10    lkut3         # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.48.12.131    lkut4            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.48.12.57     lkut5            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"

명령줄에서 매개변수를 읽어 이 작업을 수행하는 스크립트를 작성하려고 합니다.

#! /bin/bash

user=whoami
#file1=/home/xymon/server/bin/ghostlist.cgi
logfile=logfile1  ###Local Log file######
client="$1" #passing whole string as an argument
hostname=$2 #providing the hostname as an argument to script
ip=$3  #providing ip
####taking backup while editing hosts file everytime#####
#cp -pr /home/xymon/server/etc/hosts.cfg "/home/xymon/server/etc/hosts.$(date +"%Y%m%d")"
echo $ip
echo $hostname

echo "hostfile is modified @ `date`" >>$logfile

>---sed code here---<

예상 출력. 우리가 말하자myscript.sh내가 실행하려는 스크립트입니다.

sh -x myscript.sh "title AHS - abc  Linux Servers" test 0.0.0.0  

따라서 위 명령에서는 스크립트에 3개의 매개변수를 제공합니다.

  1. title AHS - abc Linux Servers- 문자열입니다.
  2. CPU 이름
  3. IP 주소

나는 다음과 같은 결과를 기대하고 있습니다 : -

# AHS - ABC Linux CBTS 
#
subparent AHS_ABC_NIX AHS_abct_NIX_CIN CBTS
title AHS - abc  Linux Servers
group-sorted
0.0.0.0 test <--- here I want to add my arguments (hostname & ip)
10.34.73.111     lkut            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3" 
10.34.73.111     lkut0            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.10.10.10      lkut1          # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.10.10.10     lkut2           # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.10.10.10    lkut3         # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.48.12.131    lkut4            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.48.12.57     lkut5            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"

답변1

그리고 awk:

awk \
-v pattern='^title AHS - abc  Linux Servers' \
-v ip="$ip" \
-v hostname="$hostname" \
'
    $0 ~ pattern {r=NR+2}
    r==NR {printf "%s %s\n",ip,hostname}
    1
' file

노트:

  • 귀하의 질문에는 4줄 뒤에 추가하라고 명시되어 있지만 출력 예제에서는 2줄 뒤에 추가합니다. 이에 따라 스크립트의 값을 변경하십시오.
  • 이렇게 하면 파일이 제자리에서 편집되지 않습니다.이봐.

답변2

awk \
    -v pattern='title AHS - abc  Linux Servers' \
    -v ip='0.0.0.0' \
    -v host='test' \
'$0 ~ "^"pattern"$" { getline; print; print ip, host; next; }1' infile

awk -- '
BEGIN{ pattern=ARGV[1]; host=ARGV[2]; ip=ARGV[3];  ARGV[1]=ARGV[2]=ARGV[3]=""; };
$0 ~ "^"pattern"$" { getline; print; print ip, host; next; }1' "$1" "$2" "$3" infile

답변3

를 사용하여 이를 수행할 수 있지만 sedsed를 호출하기 전에 몇 가지 사항을 설정해야 합니다.

  • sed는 모든 문자열을 정규식으로 처리하므로 sed 코드에 삽입하기 전에 클라이언트 var의 모든 문자를 이스케이프해야 합니다.

  • IP 및 호스트 이름 데이터가 포함된 임시 파일을 만듭니다. 이는 적절한 시간에 sed 출력 스트림으로 파일을 읽어서 수행됩니다. 이 접근 방식을 사용하면 s/// 작업의 RHS에서 특수(BRE) 문자를 이스케이프 처리하지 않아도 됩니다.

esc_client=$(
  printf '%s\n' "$client" |
  sed -e '
   s:[][\/.^$*]:\\&:g
   s/[[:blank:]][[:blank:]]*/[[:blank:]][[:blank:]]*/g
 '
)
tmpf=$(mktemp)
printf '%s %s\n' "$ip" "$hostname" > "$tmpf"

sed -e "
  /^$esc_client/!b
  n;n;r $tmpf
  d
" file

답변4

#!/bin/bash
j=$1
l=$2
m=$3
echo $j
o=`awk -v j="$j" '$0 ~ j{print NR}' filename`
o=$(($o+2))
sed -i ''$o'i '$l' '$m'' filename


Tested and worked fine

output

sh script.sh "title AHS - abc  Linux Servers" "hostname" "10.0.0.1"

praveen:/tmp$ cat p
#
# AHS - ABC Linux CBTS 
#
subparent AHS_ABC_NIX AHS_abct_NIX_CIN CBTS
title AHS - abc  Linux Servers <---this is what I want to search in text file
group-sorted
hostname 10.0.0.1
10.34.73.111     lkut            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.34.73.111     lkut0            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.10.10.10      lkut1          # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.10.10.10     lkut2           # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.10.10.10    lkut3         # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.48.12.131    lkut4            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"
10.48.12.57     lkut5            # testip "TRENDS:*,netstat:netstat|netstat1|netstat2|netstat3"

파이썬

#!/usr/bin/python
import re
import sys
z=[]
l=sys.argv[1]
k=open('filename','r')
q=k.readlines()
for b in q:
    z.append(b.strip())

o=z.index(l)
o=o+2
c=sys.argv[2]+" "+sys.argv[3]
z.insert(o,c)
for g in z:
    print g.strip()

관련 정보