Как показать линии без каких-либо изменений

Как показать линии без каких-либо изменений

Я пытаюсь отобразить строки в файле без каких-либо изменений, но строки удаляют начальные пробелы/табуляции, и я не могу этого избежать.

Мой случай: у меня есть выходной файл «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, а не на оболочку.

Связанный контент