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개의 매개변수를 제공합니다.
title AHS - abc Linux Servers
- 문자열입니다.- CPU 이름
- 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
를 사용하여 이를 수행할 수 있지만 sed
sed를 호출하기 전에 몇 가지 사항을 설정해야 합니다.
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()