수정하지 않고 파일에 줄을 표시하려고 하는데 줄에서 초기 공백/탭이 제거되어 피할 수 없습니다.
내 경우: "iptables -L -v" 출력 파일이 있습니다...
...
Chain INPUT (policy DROP 22641 packets, 2686K bytes)
pkts bytes target prot opt in out source destination
20143 11M ACCEPT all -- * * 0.0.0.0/0
0.0.0.0/0 ctstate RELATED,ESTABLISHED 3648 148K DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- ppp0 * 0.0.0.0/0 0.0.0.0/0 ...
그리고 한 줄씩 보여주려고 하는데...
...
Chain INPUT (policy DROP 22641 packets, 2686K bytes)
pkts bytes target prot opt in out source destination
20143 11M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
3648 148K DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- ppp0 * 0.0.0.0/0 0.0.0.0/0
...
다음 명령을 사용하여 한 줄씩 표시하면 초기 공백이 제거됩니다(볼 수 있는지 모르겠습니다).
for L in `cat FILE` | while read L; do echo "$L";done
또는
for L in `cat FILE` | while read L; do printf "%s\n" "$L";done
이 경우 "iptables -L" 명령의 출력은 왼쪽 열을 오른쪽으로 정렬하고 오른쪽 열을 왼쪽으로 정렬하여 좋은 효과를 얻었으며 한 줄씩 표시하고 싶습니다(예를 들어 일부 줄에 색상을 지정합니다). 형식은 동일하지만 줄은 항상 왼쪽으로 정렬되어 표시됩니다.
이유와 해결 방법을 알고 계시나요?
답변1
for L in `cat FILE` | while read L; do echo "$L";done
이것이 당신이 실행하고 있는 것인지 매우 의심스럽습니다. for
루프가 완전하지 않으며 구문 오류가 발생해야 합니다. for
에서와 같이 의 단어 목록 내에서 명령 대체 명령을 실행하면 for L in $(cat foo); do...
모든 단어가 별도의 줄로 분할됩니다(그리고 파일 이름 글로빙이 적용됩니다).
그러나 다음과 같은 것
iptables -vL | while read L; do echo "$L"; done
당신이 얻는 출력에 대해 알려줄 것입니다. read
입력을 분할하고 IFS
부작용으로 선행 및 후행 공백을 파괴합니다. IFS
원하는 것을 얻으려면 비워 두십시오 . 또한 출력에 백슬래시가 없을 가능성이 read -r
있더라도 백슬래시 처리를 비활성화하려면 를 사용하는 것이 좋습니다 . iptables
그래서:
iptables -vL | while IFS= read -r L; do echo "$L"; done
또는 다음 없이 파일에서 cat
:
while IFS= read -r L; do echo "$L"; done < file
목표가 어떤 방식으로든 입력 라인을 수정하는 것이라면 쉘 대신 awk나 Perl을 살펴보는 것이 좋습니다.