我在 Linux 系统上有一个包含以下文本的文件。我需要title AHS - abc Linux Servers
使用sed
or搜索字符串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
- 这是一个字符串- 主机名
- 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 将所有字符串视为正则表达式,因此在将客户端 var 中的任何字符插入 sed 代码之前,我们必须对其进行转义。
创建包含 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"
Python
#!/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()