簡體   English   中英

如果找到模式,如何使用awk打印“ hello”

[英]How to use awk to print “hello” if pattern is found

我想在制表符分隔的.txt文件中搜索模式 ,如果在一行中找到該模式,請打印該行的第三個字段。

我只需要查找該行中的第一個匹配項,因為該模式肯定只出現一次。

.txt文件的結構:

XXX01 foo target1
XXX02 bar target2
XXX03 foobar target3

我的第一個想法是,如果找到模式,則打印“ hello”,如果我的代碼有效,則進行控制。 我還包括了傳遞給bash腳本的變量的回顯。

命令行調用和腳本:

$ ./script.sh file.txt foo

#!/bin/bash
file=$1
pattern=$2


awk '/"$pattern"/{print "hello"}' "$file"

echo "$file"
echo "$pattern"

就我發現它為awk而言,要打印第三個字段,我必須將打印“ hello”替換為打印“ \\ $ 2”。

但是打印“ hello”已經不起作用:

實際輸出:

file.txt
foo

所需的輸出:

hello (respectively target1)
file.txt
foo 

而且我還確定,“ foo”是否在file.txt中

進度(請參閱評論並回答):

#!/bin/bash

awk -v p="$2"'$2=="$p"{print "hello",$3}' "$1"

echo "$1"
echo "$2"

新的輸出:

awk: 1:unexpected character '.'
file.txt
foo

我相信您想要類似的東西:

$ ./script.sh file.txt foo

#!/bin/bash
file=$1
pattern=$2


awk -v pattern=$pattern'$2==pattern{print "hello",$3}' "$file"

echo "$file"
echo "$pattern"

這里我們擺脫了循環,因為awk在向每個記錄提供文件時都會檢查每個記錄。 我們還使用-v標志將$pattern變量傳遞到awk腳本中。 然后,我們檢查第二個字段$2是否為pattern並打印"hello"以及第三個字段$3的內容。

您可以將awk條件更改為$2~/pattern/以真正利用正則表達式,但是我懷疑它會打印出第一行和第三行,因為foo顯示在這兩個行中。

如果要檢查模式是否在行中的任何位置,則可以刪除$2~所以它只是'/pattern/{print "hello",$2}

看:

$ x="foo"'bar' && echo "$x"
foobar

$ x="foo" 'bar' && echo "$x"
-bash: bar: command not found

您的腳本是:

awk -v p="$2"'$2=="$p"{print "hello",$3}' "$1"

因此,請猜測在-vp="$2"'$2=="$p"之間是否沒有空格。 正確,是將它們串聯起來,所以不要那樣做-添加一個空格:

awk -v p="$2" '$2=="$p"{print "hello",$3}' "$1"

出乎意料的. 順便說一句是. 在awk試圖將字符串file.txt評估為字符串時,由於連接將實際腳本消耗到p的賦值中,因此在文件名file.txt

現在要在比較中實際使用變量p ,您必須將其用作變量,而不是將其放在字符串中:

awk -v p="$2" '$2==p{print "hello",$3}' "$1"

以上只是回答您有關語法錯誤的問題。 要實際執行您想執行的操作,需要以下操作之一,具體取決於您要匹配的是字符串還是正則表達式,以及需要部分匹配還是完全匹配:

awk -v p="$2" '$2==p{print "hello",$3}' "$1"
awk -v p="$2" '$2~p{print "hello",$3}' "$1"
awk -v p="$2" '$2~"\\<"p"\\>"{print "hello",$3}' "$1"

或其他解決方案,具體取決於您到目前為止尚未說明的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM