Linux 스크립트 bash 한 줄에 붙여넣는 방법

Linux 스크립트 bash 한 줄에 붙여넣는 방법

다음과 같은 텍스트 파일이 있습니다.

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실행되었습니다.

그렇다면 인수는 공백 command4echo연결되어 표준 출력으로 전송됩니다.

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 옵션을 추가했습니다).

관련 정보