Bash 使用awk和for循环逐行读取文件

Bash 使用awk和for循环逐行读取文件,bash,for-loop,awk,hp-ux,Bash,For Loop,Awk,Hp Ux,文件包含编译器生成的警告 warnings.txt(有8行) 我想使用awk逐行读取这个文件,因为while循环需要很多时间来处理 我试过两种方法: for line in `awk '{print $0}' warnings.txt` do echo $line done 以及 预期输出: "/Project/user/XYZ/gsoap/gsoap-2.8.9/gsoap/stdsoap2.cpp", line 1657: error #4296-D: arithmetic opera

文件包含编译器生成的警告

warnings.txt(有8行)

我想使用awk逐行读取这个文件,因为while循环需要很多时间来处理

我试过两种方法:

for line in `awk '{print $0}' warnings.txt`
do
  echo $line
done
以及

预期输出:

"/Project/user/XYZ/gsoap/gsoap-2.8.9/gsoap/stdsoap2.cpp",
line
1657:
error
#4296-D:
arithmetic
operation
on
boolean
type
{
return
soap->count
-
soap->buflen
+
soap->bufidx
-
(soap->ahead
!=
0);
"/Project/user/XYZ/gsoap/gsoap-2.8.9/gsoap/stdsoap2.cpp",
line
4136:
warning
#3348-D:
declaration
hides
variable
"err"
(declared
at
line
3
700)
{
int
err
=
SSL_get_error(soap->ssl,
r);
^
同上(即文件内容逐行显示)

我的输出:

"/Project/user/XYZ/gsoap/gsoap-2.8.9/gsoap/stdsoap2.cpp",
line
1657:
error
#4296-D:
arithmetic
operation
on
boolean
type
{
return
soap->count
-
soap->buflen
+
soap->bufidx
-
(soap->ahead
!=
0);
"/Project/user/XYZ/gsoap/gsoap-2.8.9/gsoap/stdsoap2.cpp",
line
4136:
warning
#3348-D:
declaration
hides
variable
"err"
(declared
at
line
3
700)
{
int
err
=
SSL_get_error(soap->ssl,
r);
^

谢谢

改用
阅读
内置

while read -r line; do
    echo "$line"
done < warning.txt
读取-r行时
;做
回音“$line”
完成
您可以这样做:

代码:


以下是您如何使用awk读取warnings.txt并根据您发布的问题按原样重新生成文件:

$ awk '1' warnings.txt
 Line1  "/Project/user/XYZ/gsoap/gsoap-2.8.9/gsoap/stdsoap2.cpp", line 1657: error #4296-D: arithmetic operation on boolean type
 Line2{ return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0);
 Line3
 Line4
 Line5  "/Project/user/XYZ/gsoap/gsoap-2.8.9/gsoap/stdsoap2.cpp", line 4136: warning #3348-D: declaration hides variable "err" (declared at line 3
 Line6 700)
 Line7          { int err = SSL_get_error(soap->ssl, r);
 Line8                ^

显然,您可以使用
cat
来代替awk。如果您想对该文件的内容做任何其他事情,请务必让我们知道(通过使用预期输出和解释更新您的问题),以便我们可以帮助您。

while loop需要花费大量时间来处理
--谁告诉过您的?awk works是默认的行基准。
awk'1'警告。txt
将打印每行。你真正的问题是什么?@FredrikPihl,想让它在脚本中工作吗loop@devnull,这是我个人的观察,我可能错了不,你只是添加了行号。再说一遍,你想对每一行做什么?提取错误,获取行号?创建一个消息表?我们没有可用的水晶球,因此请告诉我们您希望对每一行执行什么操作?我想避免使用while循环,请检查我的查询,但是使用
awk
的版本的可移植性较低(需要外部命令),并且可能较慢(因为分叉另一个进程的开销)使用awk不会降低便携性,也不会降低速度。然而,使用awk将更简洁、更健壮、更易于扩展和维护。这比
while
循环更糟糕,据说循环太慢了。也就是说,不需要
cat
,但它也会导致缓冲问题和其他问题。它至少解决了
while
问题:它更快,而且您可以访问本地变量,因为您没有为每一行启动子进程。没有
while
问题,
while
总是比他的语法快,至少永远不会比你的语法慢,而且不太容易出错<代码>awk本身在很多情况下可能更快,但这是另一个问题。永远不要为“cat文件”中的行编写
;做事;完成
,在IFS=read-r行时写入
;做事;改为完成
while read -r line; do
    echo "$line"
done < warning.txt
ifsold="$IFS"
IFS="
"
for line in `cat warnings.txt` ; do
    echo "line: $line"
done
IFS="$ifsold"
$ awk '1' warnings.txt
 Line1  "/Project/user/XYZ/gsoap/gsoap-2.8.9/gsoap/stdsoap2.cpp", line 1657: error #4296-D: arithmetic operation on boolean type
 Line2{ return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0);
 Line3
 Line4
 Line5  "/Project/user/XYZ/gsoap/gsoap-2.8.9/gsoap/stdsoap2.cpp", line 4136: warning #3348-D: declaration hides variable "err" (declared at line 3
 Line6 700)
 Line7          { int err = SSL_get_error(soap->ssl, r);
 Line8                ^