如何将行输出到一个由 space (bash) 分隔的字符串中
How to output lines into one string separated by space (bash)
我在Bash
中有这个结构
while read line
do
echo $line | while read a b c d e f g
do
if [ $e != "0" ]; then
echo -en "|'$a'=;$g;$f;;"
fi
done
done < /tmp/res6
这篇文字是哪只猫
mem_total_app_1 5034876928 + 384000 = 5035260928 mysqld
mem_total_app_2 2994008064 + 108532736 = 3102540800 /usr/sbin/amavi(91)
mem_total_app_3 648744960 + 103424 = 648848384 redis-server
mem_total_app_4 541454336 + 58354688 = 599809024 php-fpm7.2(26)
并输出到这里
|'mem_total_app_1'=;mysqld;5035260928;;
|'mem_total_app_2'=;/usr/sbin/amavi(91);3102540800;;
|'mem_total_app_3'=;redis-server;648848384;;
|'mem_total_app_4'=;php-fpm7.2(26);599809024;;
我希望在一个字符串中以 space 分隔输出。像这样
|'mem_total_app_1'=;mysqld;5035260928;; 'mem_total_app_2'=;amavi(91);3102540800;; 'mem_total_app_3'=;redis-server;648848384;; 'mem_total_app_4'=;php-fpm7.2(26);599809024;;
有人可以提示我吗?
只需将换行符替换为 space:
tr '\n' ' ' < input_filename
这可能不是最漂亮的方式,但您可以像这样将整个循环传送到 tr
:
{
while read line
do
echo $line | while read a b c d e f g
do
if [ $e != "0" ]; then
echo -en "|'$a'=;$g;$f;;"
fi
done
done < /tmp/res6
} | tr '\n' ' '
(注意小胡子括号周围的空格。)
尝试prinft
命令
printf
命令提供了一种打印预格式化文本的方法,类似于printf()
系统接口(C函数).它的意思是 successor for echo
,并且具有 更多的功能和可能性 。
printf "|"
while read line
do
echo $line | while read a b c d e f g
do
if [ $e != "0" ]; then
printf " '$a'=;$g;$f;;"
fi
done
done < /tmp/res6
输出:-
| 'mem_total_app_1'=;mysqld;5035260928;; 'mem_total_app_2'=;/usr/sbin/amavi(91);3102540800;; 'mem_total_app_3'=;redis-server;648848384;; 'mem_total_app_4'=;php-fpm7.2(26);599809024;;
tr '\n' ' '
是一个不错的方法,但是如果你想避免在最后出现 space,请使用
<input_file paste -sd' '
这很方便,例如用 bc
:
进行计算
<one_number_on_line paste -sd+ | bc
为您提供所有行的总和(每行一个数字)。
如果可以使用awk
:
awk 'BEGIN{OFS=";";ORS=";; ";printf "|"}{print "7""7",$NF,$(NF-1)}' file
脚本设置输出分隔符 OFS
和 ORS
以便它可以使用 ;
打印内容。请注意,7
是单引号字符。
我在Bash
中有这个结构while read line
do
echo $line | while read a b c d e f g
do
if [ $e != "0" ]; then
echo -en "|'$a'=;$g;$f;;"
fi
done
done < /tmp/res6
这篇文字是哪只猫
mem_total_app_1 5034876928 + 384000 = 5035260928 mysqld
mem_total_app_2 2994008064 + 108532736 = 3102540800 /usr/sbin/amavi(91)
mem_total_app_3 648744960 + 103424 = 648848384 redis-server
mem_total_app_4 541454336 + 58354688 = 599809024 php-fpm7.2(26)
并输出到这里
|'mem_total_app_1'=;mysqld;5035260928;;
|'mem_total_app_2'=;/usr/sbin/amavi(91);3102540800;;
|'mem_total_app_3'=;redis-server;648848384;;
|'mem_total_app_4'=;php-fpm7.2(26);599809024;;
我希望在一个字符串中以 space 分隔输出。像这样
|'mem_total_app_1'=;mysqld;5035260928;; 'mem_total_app_2'=;amavi(91);3102540800;; 'mem_total_app_3'=;redis-server;648848384;; 'mem_total_app_4'=;php-fpm7.2(26);599809024;;
有人可以提示我吗?
只需将换行符替换为 space:
tr '\n' ' ' < input_filename
这可能不是最漂亮的方式,但您可以像这样将整个循环传送到 tr
:
{
while read line
do
echo $line | while read a b c d e f g
do
if [ $e != "0" ]; then
echo -en "|'$a'=;$g;$f;;"
fi
done
done < /tmp/res6
} | tr '\n' ' '
(注意小胡子括号周围的空格。)
尝试prinft
命令
printf
命令提供了一种打印预格式化文本的方法,类似于printf()
系统接口(C函数).它的意思是 successor for echo
,并且具有 更多的功能和可能性 。
printf "|"
while read line
do
echo $line | while read a b c d e f g
do
if [ $e != "0" ]; then
printf " '$a'=;$g;$f;;"
fi
done
done < /tmp/res6
输出:-
| 'mem_total_app_1'=;mysqld;5035260928;; 'mem_total_app_2'=;/usr/sbin/amavi(91);3102540800;; 'mem_total_app_3'=;redis-server;648848384;; 'mem_total_app_4'=;php-fpm7.2(26);599809024;;
tr '\n' ' '
是一个不错的方法,但是如果你想避免在最后出现 space,请使用
<input_file paste -sd' '
这很方便,例如用 bc
:
<one_number_on_line paste -sd+ | bc
为您提供所有行的总和(每行一个数字)。
如果可以使用awk
:
awk 'BEGIN{OFS=";";ORS=";; ";printf "|"}{print "7""7",$NF,$(NF-1)}' file
脚本设置输出分隔符 OFS
和 ORS
以便它可以使用 ;
打印内容。请注意,7
是单引号字符。