수정하지 않고 파일의 줄을 표시하려고 하는데 줄의 초기 공백/탭이 제거되어 피할 수 없습니다.
내 상황: "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
원하는 것을 얻으려면 null을 제공하십시오 . 또한 출력에 백슬래시가 없을 가능성이 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을 사용하여 이 작업을 수행할 수도 있습니다.