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

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

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

내 경우: "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을 살펴보는 것이 좋습니다.

관련 정보