我有一个看起来像这样的文件(它可以多于2行):
$ cat /tmp/temp.txt
;user1;1.1.1.1;DB1;SELECT;
;userX;2.2.2.2;DB4;SELECT;
我想这样更改它:
user: user1 address: 1.1.1.1 db: DB1 right: SELECT
user: userX address: 2.2.2.2 db: DB4 right: SELECT
我认为最简单的方法是使用read
函数:
!/bin/bash
filename='/tmp/temp.txt'
while read ; do
user=$(cut -d";" -f2 /tmp/temp.txt)
address=$(cut -d";" -f3 /tmp/temp.txt)
database=$(cut -d";" -f4 /tmp/temp.txt)
right=$(cut -d";" -f5 /tmp/temp.txt)
echo "user:$user address:$address database:$database right:$right"
done < $filename
脚本的输出为:
user:user1
userX address:1.1.1.1
2.2.2.2 database:DB1
DB4 right: SELECT
SELECT
user:user1
userX address:1.1.1.1
2.2.2.2 database:DB1
DB4 right: SELECT
SELECT
我希望输出的行数与输入文件中的行数相同。
答案 0 :(得分:3)
只需使用awk
:
$ awk -F ';' '{ print "user:", $2, "address:", $3, "db:", $4, "right:", $5 }' your_file
这会将文件的每一行分割为分号,然后以所需的输出格式打印出所需的列。
答案 1 :(得分:1)
如果您希望坚持使用bash,则可以在正确的轨道上进行,但是您要做的工作太多:
filename='/tmp/temp.txt'
while read ; do
user=$(cut -d";" -f2 /tmp/temp.txt)
address=$(cut -d";" -f3 /tmp/temp.txt)
database=$(cut -d";" -f4 /tmp/temp.txt)
right=$(cut -d";" -f5 /tmp/temp.txt)
echo "user:$user address:$address database:$database right:$right"
done < $filename
您正确地使用了while read; do ...; done < file
类,但是您没有使用在循环中读取的数据。循环内有4个cut命令,因此您要为文件中的每一行处理整个文件4次。
read
将数据存储在默认的$REPLY
变量中。您可以做
filename='/tmp/temp.txt'
while read ; do
user=$(echo "$REPLY" | cut -d";" -f2)
address=$(echo "$REPLY" | cut -d";" -f3)
database=$(echo "$REPLY" | cut -d";" -f4)
right=$(echo "$REPLY" | cut -d";" -f5)
...
但是壳仍然可以使用外部命令来执行本机操作。
使用IFS
变量来帮助您解析每一行:您拥有以分号分隔的数据,因此您可以执行以下操作:
while IFS=";" read -r empty user address database right empty; do
echo "user:$user address:$address database:$database right:$right"
done < $filename
请注意“空”变量占位符,以将数据保存在第一个分号之前和最后一个分号之后。
答案 2 :(得分:1)
使用sed,从左到右一一替换分号:
$ sed 's/;/user: /;s/;/ address: /;s/;/ db: /;s/;/ right: /;s/;//' infile
user: user1 address: 1.1.1.1 db: DB1 right: SELECT
user: userX address: 2.2.2.2 db: DB4 right: SELECT
答案 3 :(得分:0)
请您尝试以下。
01234