Я пытаюсь отобразить строки в файле без каких-либо изменений, но строки удаляют начальные пробелы/табуляции, и я не могу этого избежать.
Мой случай: у меня есть выходной файл «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, а не на оболочку.