如何在 Shell 脚本中读取文件中某些文本后的某些行

时间:2020-12-21 07:25:53

标签: sql bash shell awk

我有 SQL 文件,我需要从特定的 SQL 查询(即用户传递的 SQL 查询)到 SQL 文件的末尾获取 SQL 查询。

让我们举个例子:

下面是SQL文件:

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway');

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Thomas', 'Tom B. James', 'Skagen 22', 'Stavanger', '4007', 'Norway');

Update Customers set CustomerName = 'ABC' where PostalCode = '4006'

Delete from Customers where PostalCode = '4007'

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Rose', 'Tom B. Smith', 'Skagen 23', 'Stavanger', '4008', 'Norway');

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Jim', 'Tom B. Jonny', 'Skagen 24', 'Stavanger', '4009', 'Norway');

这里用户传递查询 Update Customers set CustomerName = 'ABC' where PostalCode = '4006',我将用户传递的 SQL 查询存储在变量 $sql

现在我需要得到如下输出

Update Customers set CustomerName = 'ABC' where PostalCode = '4006'

Delete from Customers where PostalCode = '4007'

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Rose', 'Tom B. Smith', 'Skagen 23', 'Stavanger', '4008', 'Norway');

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Jim', 'Tom B. Jonny', 'Skagen 24', 'Stavanger', '4009', 'Norway');

为了得到上面的输出,我使用了下面的代码

awk -v var="$sql" '$0 == "var" {i=1;next};i && i++' test.sql

在这里,我将 sql 变量内容存储在 var 变量中,并在文件中搜索特定的 SQL 查询,在获取特定的 SQL 查询(由用户传递)后,我正在从 SQL 查询打印 SQL 查询哪个用户已传递到文件末尾。

再举一个例子:

如果用户通过 INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) VALUES ('Rose', 'Tom B. Smith', 'Skagen 23', 'Stavanger', '4008', 'Norway'); 我应该得到以下输出

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Rose', 'Tom B. Smith', 'Skagen 23', 'Stavanger', '4008', 'Norway');

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Jim', 'Tom B. Jonny', 'Skagen 24', 'Stavanger', '4009', 'Norway');

我没有得到输出。

谁能帮我解决上面的问题。这对他很有帮助。

注意:我的 SQL 查询包含所有 DML 语句,我的一个 SQL 查询也不是单行查询。它将占用超过 4-5 行。示例目的我在这里使用了单行查询。

谁能帮我解决通用方法,以便它对文件中存在的所有 SQL 查询都有用?

3 个答案:

答案 0 :(得分:0)

根据您展示的样品,您可以尝试以下操作吗?在 GNU awk 中编写和测试。

##Creating shell variables named insert and value here before passing them to awk code.
insert="INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)"
value="VALUES ('Rose', 'Tom B. Smith', 'Skagen 23', 'Stavanger', '4008', 'Norway');"

##Starting awk code from here and passing shell variables to it.
awk -v insert="$insert" -v value="$value" '
/^INSERT/ && foundInsertcouple{
  print
  next
}
/^VALUES/ && foundInsertcouple{
  print
  foundInsertcouple=""
  next
}
/^INSERT/ && $0==insert{
  foundInsert=1
  val=$0
  next
}
/^VALUES/ && foundInsert && $0==value{
  print val ORS $0
  val=foundInsert=""
  foundInsertcouple=1
  next
}'  Input_file

答案 1 :(得分:0)

在 SQL 中:select id, firstname, lastname from authors

如果提供:Firstname: evil'exLastname: Newman

查询字符串变为:

select id, firstname, lastname from authors where firstname = 'evil'ex' and lastname ='newman'

数据库尝试运行的方式:

<块引用>

il' 附近的语法不正确,因为数据库试图执行邪恶。

答案 2 :(得分:-1)

这是正确答案

file='read_file.txt'  
  
i=1  
while read line; do  
  
#Reading each line  
echo "Line No. $i : $line"  
i=$((i+1))  
done < $file
相关问题