如何将命令输出中的字段与空格分开?

时间:2018-01-28 04:48:31

标签: bash shell unix

当我运行class DBConnection { /** * Connection object */ private $connection; /** * Construct */ public function __construct() { // Create a db connection assign to $this->connection $this->connection = new PDO(getenv('DB_HOST'), getenv('DB_USER'), ......); } /** * Get all users */ public function getUser() { return $this->connection->query("SELECT * FROM USER"); } } /** * New an instance of DBConnection * After that, they are all prepared. */ $database = new DBConnection; /** * Call that function to get all users. */ $database->getUser(); 时,我得到这样的输出。如果用户名和命令名很大,则第2列与第3列发生冲突。我不希望这样。每当发生碰撞时,我想用空格分隔这些列。我该如何处理?

当前输出:

sockstat -l

预期产出:

USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
xxxxxxxxxx apacheexp2356 3  tcp46  *:9117                 *:*
root     ntpd       819   20 udp6   *:123                 *:*
prometheus prometheus870  3  tcp46  *:9090                *:*
root     httpd      1049  3  tcp6   *:80                  *:*

UPDATE1: 命令有数字

的例外情况

提供解决方案的当前输出:

USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
xxxxxxxxxx apacheexp 2356 3  tcp46  *:9117                 *:*
root     ntpd       819   20 udp6   *:123                 *:*
prometheus prometheus 870  3  tcp46  *:9090                *:*
root     httpd      1049  3  tcp6   *:80                  *:*

预期产出:

USER COMMAND  PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
nagios nrpe 3 2222 4 tcp6 *:5666 *:*

2 个答案:

答案 0 :(得分:2)

以下可能对您有帮助。

your_command | awk '{match($2,/[^[:digit:]]*/);$2=substr($2,RSTART,RLENGTH) FS substr($2,RSTART+RLENGTH)} 1'

或者为了区分可能有帮助的所有内容和数字,考虑到数字可能位于进程名称的最后:

your_command | awk '{
match($2,/[a-zA-Z]+/);
$2=substr($2,RSTART,RLENGTH) FS substr($2,RSTART+RLENGTH)
}
1
' 

现在也添加非单线形式的解决方案。

dplyr

答案 1 :(得分:0)

用空格替换第21个字符可以解决问题 sed 's/./ /21'。如果有任何特殊情况,请指出。