Поиск строки в текстовом файле и добавление аргументов во 2-й строке после совпадения

Согласно https://superuser.com/questions/555918/how-do-i-list-all-the-files-not-owned-by-any-package-in-a-rpm-based-system, следующая команда является надежной основой для того, что вам нужно:

comm -13 <(rpm -qla | sort) <(find / -type f | sort)

Выполните дальнейшую настройку, отфильтровав команду поиска по интересующим каталогам (либо указав список каталогов вместо /(, например./{usr,bin})или за исключением таких папок, как /proc, /dev, /homeи /tmp.

-1
21.12.2020, 15:14
4 ответа

С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 строк. Соответственно измените значение в скрипте.
  • Это не редактирует файл на месте, см. здесь .
0
18.03.2021, 22:41
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
0
18.03.2021, 22:41

Мы можем сделать это с помощью sed, но прежде чем мы вызовем sed, нам нужно настроить несколько вещей.

  • Поскольку sed обрабатывает все строки как регулярное выражение, мы должны экранировать любой символ в клиентской переменной, прежде чем вставлять его в наш код sed.

  • Создайте временный файл, содержащий данные об IP-адресе и имени хоста. Это нужно для чтения этого файла в поток вывода sed в соответствующее время. Обратите внимание, что этот метод избавляет нас от необходимости экранировать какие-либо специальные символы (BRE )в правой части операции s///.

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
0
18.03.2021, 22:41
#!/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()
0
18.03.2021, 22:41

Теги

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