다음과 같은 텍스트 파일이 있습니다.
k-opp- -l fi -s linux -a BHHHHH7 -d 22.22.222.22 -g ai
k-opp- -l fi -s linux -a BHHHHH8 -d 222.22.22.22 -g ai
k-opp- -l fi -s linux -a BHHHHH9 -d 222.222.22.222 -g ai
나는 몇 가지 스크립트를 만들었습니다:
#!/bin/sh
file=list.txt
while read line
do
echo $line |grep -o -P '(?<=-a).*(?=-d)' >>somefile.txt
$line <checkcon.sh >>somefile.txt
done < "$file"
이 스크립트는 ssh
내 컴퓨터로 전송되어 두 번째 스크립트를 실행하고 필요한 정보를 가져옵니다.
이것질문출력은 다음과 같습니다.
BHHHHH7
eth: inet 22.22.222.22
BHHHHH8
eth: inet 222.22.22.22
BHHHHH8
eth: inet 222.222.22.222
내가 하고 싶은 것:
BHHHHH7 eth: inet 22.22.222.22
BHHHHH8 eth: inet 222.22.22.22
...continues..
스크립트를 한 줄로 인쇄하는 방법을 아는 사람이 있습니다. 미리 감사드립니다 :)
답변1
명령 대체 사용:
echo "$(echo $line |grep -o -P '(?<=-a).*(?=-d)' ) $(echo abc)" >> some_file_to_append_next_line_to
두 번째 부분을 변경해야 합니다. 데이터에서 명령을 실행하지 않고도 테스트할 수 있도록 변경했습니다.
기본 형태는 다음과 같습니다.
command4 "$(command1) $(command2)" "$(command3)"
여기에서 command1
달리고 command2
있습니다. 표준 출력은 함께 연결됩니다(그들 사이에 공백이 있으므로 사이에 공백이 있음). 결과는 매개변수 1에 배치됩니다 commond4
. 표준 출력은 command3
매개변수 2로 사용됩니다 command4
. 그런 다음 command4
실행되었습니다.
그렇다면 인수는 공백 command4
과 echo
연결되어 표준 출력으로 전송됩니다.
PS 데이터에서 명령을 실행할 때는 주의하세요. 취약해질 수 있습니다. 데이터를 제공하는 사람은 누구나 원하는 명령을 실행할 수 있습니다.
답변2
전선 쌍이 있으므로 sed
-one-liner로 연결해 보는 것은 어떨까요?
출력을 파이프하면됩니다 ...
sed '$!N;s/\n/ /'
따라서 원본 스크립트를 다음과 같이 변경하십시오.
#!/bin/sh
file=list.txt
cat "$file" | while read line
do
echo $line |grep -o -P '(?<=-a).*(?=-d)'
$line <checkcon.sh # This line can not possibly work...
done | sed '$!N;s/\n/ /' >>somefile.txt
그러나 작동하지 않는 원본 스크립트의 한 줄로 인해 일부 오류가 발생합니다.
me@home:~$ ./script.sh
./script.sh: 6: ./script.sh: cannot open checkcon.sh: No such file
./script.sh: 6: ./script.sh: k-opp-: not found
./script.sh: 6: ./script.sh: cannot open checkcon.sh: No such file
./script.sh: 6: ./script.sh: k-opp-: not found
./script.sh: 6: ./script.sh: cannot open checkcon.sh: No such file
./script.sh: 6: ./script.sh: k-opp-: not found
me@home:~$ cat somefile.txt
BHHHHH7 BHHHHH8
BHHHHH9
아마도 $line
이것을 매개변수로 checkcon.sh
: 에 전달해야 할 것입니다 checkcon.sh "$line"
.
물론 checkcon.sh
여기에도 출력이 없습니다.
checkcon.sh
표준 출력에서 출력을 생성하는 더미 객체를 사용하면 예상대로 작동합니다.
me@home:~$ ./script.sh
me@home:~$ cat somefile.txt
BHHHHH7 eth: inet 22.22.222.22
BHHHHH8 eth: inet 222.22.22.22
BHHHHH9 eth: inet 222.222.22.222
답변3
사용해 보십시오 echo -n $line |grep -o -P '(?<=-a).*(?=-d)' >>somefile.txt
(echo 명령이 문자열 끝에 추가하는 후행 개행 문자를 제거하는 -n 옵션을 추가했습니다).