수정하지 않고 라인을 표시하는 방법

수정하지 않고 라인을 표시하는 방법

수정하지 않고 파일의 줄을 표시하려고 하는데 줄의 초기 공백/탭이 제거되어 피할 수 없습니다.

내 상황: "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을 사용하여 이 작업을 수행할 수도 있습니다.

관련 정보