簡體   English   中英

在bash中某個字符串之后打印字符串行

[英]Print lines of strings after a certain String in bash

我在bash中有此代碼,它獲取了fileA.txt中的最后一個字符串,並將其與if語句中的fileB.txt進行比較。

fileA.txt包含:
[GRP2.0] 10221 ==== 2013-03-10 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10222 ==== 2013-03-11 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10223 ==== 2013-03-12 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10224 ==== 2013-03-13 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10225 ==== 2013-03-14 10:55:26-Custom field deleted,fields,admin

fileB.txt包含:

[GRP2.0] 10223 ==== 2013-03-12 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10224 ==== 2013-03-13 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10225 ==== 2013-03-14 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10226 ==== 2013-03-15 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10227 ==== 2013-03-16 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10228 ==== 2013-03-17 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10229 ==== 2013-03-18 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10230 ==== 2013-03-19 10:55:26-Custom field deleted,fields,admin

題:
$filefileA.txt

在fileB.txt中$ stringCompared之后,有沒有辦法回顯所有內容?

$stringCompared具有:
[GRP2.0] 10225 ==== 2013-03-14 10:55:26-Custom field deleted,fields,admin

文件C.txt中的預期輸出:
[GRP2.0] 10226 ==== 2013-03-15 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10227 ==== 2013-03-16 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10228 ==== 2013-03-17 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10229 ==== 2013-03-18 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10230 ==== 2013-03-19 10:55:26-Custom field deleted,fields,admin

lastString=$(tac "$file" |egrep -m1 '.')
        stringCompared=$lastString
        if grep -Fxq "$lastString" /folder/fileB.txt; then

        tac /folder/fileB.txt | awk -v savedString="$stringCompared" '1; $0 ~ savedString {exit}' | tac

        printf "$savedString\n"
        echo "$savedString" | tee /folder/temp.txt  

我也嘗試過使用另一條路線:

savedString=$(sed '1,/'"$stringCompared"'/d' /folder/fileB.txt)

但這不起作用,有任何提示嗎?

使用tac從頭開始處理文件,打印直至匹配,然后tac返回:

tac file | awk '/match/ {exit} 1' | tac

測試

$ seq 10 | tac | awk '/5/ {exit}1' | tac
6
7
8
9
10

要么

$ seq 10 | tac | awk '1; /5/ {exit}' | tac
5
6
7
8
9
10

如果您還想打印匹配的行。

您可以使用awk

awk 'FNR==NR{lastStr=$0; next} !p && p=index($0, lastStr){next} p' fileA.txt fileB.txt
[GRP2.0] 10226 ==== 2013-03-15 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10227 ==== 2013-03-16 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10228 ==== 2013-03-17 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10229 ==== 2013-03-18 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10230 ==== 2013-03-19 10:55:26-Custom field deleted,fields,admin

awk解救!

$ awk -v s="$(tail -1 fileA.txt)" 'f; s==$0{f=1}' fileB.txt

[GRP2.0] 10226 ==== 2013-03-15 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10227 ==== 2013-03-16 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10228 ==== 2013-03-17 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10229 ==== 2013-03-18 10:55:26-Custom field deleted,fields,admin
[GRP2.0] 10230 ==== 2013-03-19 10:55:26-Custom field deleted,fields,admin

提取fileA的最后一行並分配給awk變量s,當fileB中的一行等於s時,設置標志f,打印設置標志的行。

暫無
暫無

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

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