awk 第x1行 到 第x2行

本文介绍了如何使用awk命令通过行号或模式匹配选择文件中特定行范围的方法。包括使用NR和FNR变量指定绝对行号范围,以及使用/pattern1/,/pattern2/语法匹配两模式间的所有行。

1. 用NR或者FNR来选择行范围

awk 'NR==5,NR==7 {print $0}'  demo.txt

awk 'NR>=5 && NR<=7 {print $0}'  demo.txt

 

两者效果一样:  输出demo.txt中从第5行 到 第7行

 

把 NR  换成 FNR,则表示  如果输入文件有多个,那么每个文件的第一行从0开始计数

 

 

awk 'FNR==5,FNR==7 {print $0}'  demo1.txt demo2.txt

 

这两个文件的从第5行 到 第7行

 

2. /pattern1/, /pattern2/

第一个匹配pattern1的行  到  第一个匹配pattern2的行  之间的所有行

awk ' /pattern1/, /pattern2/ {print $0}'  demo.txt

root@Archer_AXE75:/# wl -i wl0.2 sta_info all [VER 8] STA 3C:52:A1:78:16:86: chanspec 48/80 (0xe32a) aid:22 rateset [ 6 9 12 18 24 36 48 54 ] idle 0 seconds in network 81 seconds state: AUTHENTICATED ASSOCIATED AUTHORIZED connection: SECURED auth: WPA2-PSK crypto: AES_CCM flags 0x3d1e03b: BRCM WME N_CAP VHT_CAP HE_CAP AMPDU AMSDU GBL_RCLASS DWDS_CAP DWDS_ACTIVE HT caps 0x9ef: LDPC 40MHz SGI20 SGI40 STBC-Tx STBC-Rx VHT caps 0x1f: LDPC SGI80 SGI160 STBC-Tx STBC-Rx HE caps 0x6639: LDPC HE-HTC SU-BFR SU&MU-BFE OMI 0x0271: 80Mhz rx=2ss tx=2ss ER_SU_DISABLE UL_MU_DISABLE tx total pkts: 11505 tx total bytes: 48805112 tx ucast pkts: 11467 tx ucast bytes: 48801445 tx mcast/bcast pkts: 38 tx mcast/bcast bytes: 3667 tx failures: 1 rx data pkts: 166 rx data bytes: 62998 rx data dur: 0 rx ucast pkts: 123 rx ucast bytes: 57376 rx mcast/bcast pkts: 43 rx mcast/bcast bytes: 5622 rate of last tx pkt: 1200950 kbps - 720580 kbps rate of last rx pkt: 1200950 kbps rx decrypt succeeds: 163 rx decrypt failures: 0 tx data pkts retried: 8 per antenna rssi of last rx data frame: -33 -27 0 0 per antenna average rssi of rx data frames: -32 -26 0 0 per antenna noise floor: -81 -81 0 0 tx total pkts sent: 11485 tx pkts retries: 2723 tx pkts retry exhausted: 0 tx FW total pkts sent: 0 tx FW pkts retries: 0 tx FW pkts retry exhausted: 0 rx total pkts retried: 23 MCS SET : [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] VHT SET : 0x1 1x1 2x1 3x1 4x1 5x1 6x1 7x1 8x1 9x1 10x1 11x1 : 0x2 1x2 2x2 3x2 4x2 5x2 6x2 7x2 8x2 9x2 10x2 11x2 HE SET : 20/40/80 MHz: NSS1 Tx: 0-11 Rx: 0-11 NSS2 Tx: 0-11 Rx: 0-11 smoothed rssi: -26 tx nrate he mcs 11 Nss 2 Tx Exp 0 bw80 ldpc 2xLTF GI 0.8us auto rx nrate he mcs 11 Nss 2 Tx Exp 0 bw80 ldpc 2xLTF GI 0.8us auto wnm 0x0: VENDOR OUI VALUE[0] 00:90:4C VENDOR OUI VALUE[1] 00:10:18 VENDOR OUI VALUE[2] 00:50:F2 link bandwidth = 80 MHZ RRM capability = 0x0 Frequency Bands Supported: 5G root@Archer_AXE75:/# wl -i wl0.2 sta_info all [VER 8] STA 3C:52:A1:78:16:86: chanspec 48/80 (0xe32a) aid:22 rateset [ 6 9 12 18 24 36 48 54 ] idle 0 seconds in network 227 seconds state: AUTHENTICATED ASSOCIATED AUTHORIZED connection: SECURED auth: WPA2-PSK crypto: AES_CCM flags 0x3d1e03b: BRCM WME N_CAP VHT_CAP HE_CAP AMPDU AMSDU GBL_RCLASS DWDS_CAP DWDS_ACTIVE HT caps 0x9ef: LDPC 40MHz SGI20 SGI40 STBC-Tx STBC-Rx VHT caps 0x1f: LDPC SGI80 SGI160 STBC-Tx STBC-Rx HE caps 0x6639: LDPC HE-HTC SU-BFR SU&MU-BFE OMI 0x0271: 80Mhz rx=2ss tx=2ss ER_SU_DISABLE UL_MU_DISABLE tx total pkts: 20324 tx total bytes: 81378264 tx ucast pkts: 20106 tx ucast bytes: 81357922 tx mcast/bcast pkts: 218 tx mcast/bcast bytes: 20342 tx failures: 5 rx data pkts: 539 rx data bytes: 126300 rx data dur: 0 rx ucast pkts: 411 rx ucast bytes: 109393 rx mcast/bcast pkts: 128 rx mcast/bcast bytes: 16907 rate of last tx pkt: 1080880 kbps - 612500 kbps rate of last rx pkt: 1134230 kbps rx decrypt succeeds: 536 rx decrypt failures: 0 tx data pkts retried: 8 per antenna rssi of last rx data frame: -33 -36 0 0 per antenna average rssi of rx data frames: -32 -35 0 0 per antenna noise floor: -73 -75 0 0 tx total pkts sent: 20130 tx pkts retries: 4379 tx pkts retry exhausted: 0 tx FW total pkts sent: 0 tx FW pkts retries: 0 tx FW pkts retry exhausted: 0 rx total pkts retried: 59 MCS SET : [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] VHT SET : 0x1 1x1 2x1 3x1 4x1 5x1 6x1 7x1 8x1 9x1 10x1 11x1 : 0x2 1x2 2x2 3x2 4x2 5x2 6x2 7x2 8x2 9x2 10x2 11x2 HE SET : 20/40/80 MHz: NSS1 Tx: 0-11 Rx: 0-11 NSS2 Tx: 0-11 Rx: 0-11 smoothed rssi: -32 tx nrate he mcs 10 Nss 2 Tx Exp 0 bw80 ldpc 2xLTF GI 0.8us auto rx nrate he mcs 11 Nss 2 Tx Exp 0 bw80 ldpc 2xLTF GI 1.6us auto wnm 0x0: VENDOR OUI VALUE[0] 00:90:4C VENDOR OUI VALUE[1] 00:10:18 VENDOR OUI VALUE[2] 00:50:F2 link bandwidth = 80 MHZ RRM capability = 0x0 Frequency Bands Supported: 5G
最新发布
09-04
<think>我们被要求将Git的提交历史导出到CSV文件中。CSV文件通常包含列,每列代表一个字段,每代表一个提交。 常见的字段包括:提交哈希、作者、提交日期、提交消息等。 我们可以使用`git log`命令来获取这些信息,并格式化输出,然后重定向到CSV文件。 具体步骤: 1. 使用`git log`命令,并指定格式。我们可以使用`--pretty=format:`来定义每一的格式,用`%x2C`(代表逗号)分隔字段,但注意某些字段可能包含逗号(如提交消息),所以最好用双引号包裹。 2. 为了避免字段内的逗号造成干扰,我们将每个字段用双引号括起来,并且将字段内的双引号转义(替换为两个双引号)。 3. 我们可以指定需要的字段,例如:%H(提交哈希)、%an(作者名字)、%ad(提交日期)、%s(提交主题)等。 但是,`git log`的格式字符串中,我们可以使用占位符,并且用分隔符分开。注意,日期格式最好统一。 命令示例: git log --all --pretty=format:'"%H","%an","%ad","%s"' --date=iso > commits.csv 但是,这个命令没有表头。我们可以先输出表头,然后输出内容。 更完整的命令: (echo "Commit Hash,Author,Date,Message"; git log --all --pretty=format:'"%H","%an","%ad","%s"' --date=iso) > commits.csv 但是注意,上面的命令中,表头是英文的,并且用逗号分隔。而数据部分也是用逗号分隔,并且每个字段都有双引号。 然而,消息字段可能包含换符,这会导致CSV格式错误。为了避免这种情况,我们可以将消息字段中的换符替换为空格或其他字符。但是,`git log`的`%s`只显示主题(即第一),而`%b`是消息体,但通常我们只需要主题。如果需要完整消息,可以用`%B`,但这样会有换。 所以,如果我们只需要主题(即提交的第一),那么使用`%s`是安全的。如果需要完整消息,则必须处理换符。这里我们假设只需要主题。 另外,日期格式使用`--date=iso`会得到类似"2022-05-16 12:34:56 +0800"的格式。 如果我们需要更多的字段,比如作者邮箱,可以使用`%ae`。 因此,我们可以创建一个包含多个字段的CSV。 但是,如果提交信息中包含双引号,我们需要将其转义为两个双引号。在`git log`的format中,我们可以使用`%x22`来代表双引号,但是这样输出会使得字段内出现双引号,而整个字段又被双引号包裹,按照CSV标准,内部的双引号需要转义为两个双引号。然而,`git log`的format并没有提供自动转义的功能。因此,我们需要后续处理,或者接受在消息中有双引号可能破坏格式的风险。 另一种方法是使用编程语言来处理,比如使用Python脚本,但这里要求用命令。 我们可以使用sed命令来将字段内的双引号替换为两个双引号,但要注意,我们只替换字段内的双引号,而不包括字段包裹的双引号。由于我们使用`git log`输出的格式是:每个字段用双引号包裹,那么字段内的双引号在输出时就是双引号。我们可以对整个处理:将每个字段内的双引号替换为两个双引号,但是注意,我们只在字段内容中替换,而字段包裹的双引号不需要替换。然而,这个替换比较麻烦,因为我们在一个字符串中。 实际上,我们可以分两步: 1. 使用`git log`输出,然后通过sed将每个字段内的双引号替换为两个双引号。 2. 然后,再在字段内容的两端加上双引号(但是`git log`的format已经加了,所以第一步替换后,我们只需要处理字段内原有的双引号)。 但是,由于我们已经在格式中每个字段都加了双引号,那么字段内的双引号会破坏格式。所以,我们需要在输出之前对每个字段进转义(将双引号替换为两个双引号)。但是,`git log`的format不支持这个,所以我们只能通过管道用sed处理。 命令可以修改为: (echo "Commit Hash,Author,Date,Message"; \ git log --all --pretty=format:'"%H","%an","%ad","%s"' --date=iso | \ sed 's/"/""/g') > commits.csv 但是,这样会将整个中的双引号都替换,包括我们用来包裹字段的双引号。例如,原来的一是:"hash","name","date","message",经过sed后变成:""hash"",""name"",""date"",""message"",这显然不对。 我们想要的是,只替换字段内容中的双引号,而不包括字段分隔用的双引号。但是,我们无法区分。所以,我们可以改变思路:不在`git log`的格式中加双引号,而是先输出不带双引号的字段,然后对每个字段内的双引号和逗号进处理,再包裹双引号。 但是,这样处理起来比较复杂。一个简单的方法是,我们只对消息字段进转义(因为其他字段如哈希、作者名、日期通常不含双引号)。但是,作者名可能包含双引号吗?理论上,作者名可以包含任何字符,包括逗号和双引号。所以,为了安全,每个字段都需要转义。 因此,我们可以这样: 1. 使用`git log`输出每个字段,但是不加双引号,用特定的分隔符(比如`|`)分隔,然后使用awk或sed来处理,将每个字段内的双引号替换为两个双引号,然后在每个字段两端加上双引号,并将分隔符替换为逗号。 但是,为了简单,我们可以使用一个更强大的工具:`git log`支持输出为XML或JSON,但这里我们要求CSV,所以我们可以使用第三方工具,比如`git2json`,但题目要求使用命令,且可能没有安装额外工具。 因此,我们采用一个折中:假设作者名、日期和哈希中不包含逗号和双引号,而消息中可能有双引号,我们只对消息中的双引号进转义,并且用双引号包裹消息字段。 命令如下: (echo "Commit Hash,Author,Date,Message"; \ git log --all --pretty=format:'%H,%an,%ad,%s' --date=iso | \ awk -F',' -v OFS=',' '{ # 对第四个字段(消息)进处理:转义双引号,并包裹双引号 $4 = "\"" gensub(/"/, "\"\"", "g", $4) "\"" # 其他字段,如果也需要包裹双引号,可以类似处理,但这里假设前三个字段不需要转义,直接包裹 $1 = "\"" $1 "\"" $2 = "\"" $2 "\"" $3 = "\"" $3 "\"" print }') > commits.csv 但是,这个awk命令在第四字段处理时,先转义双引号,然后包裹双引号。同时,前三个字段也包裹双引号(因为可能包含逗号,虽然可能性小,但为了安全)。 但是,注意`%ad`日期格式,我们使用了`--date=iso`,它包含空格,所以我们在用逗号分隔时,日期字段会被分割成多个字段吗?是的,因为日期格式是“YYYY-MM-DD HH:MM:SS +TZ”,其中有一个空格,所以会被分割成两个字段。这样,我们就有5个字段(哈希、作者、日期的日期部分、日期的时间部分、消息),而不是4个。 所以,我们需要将日期作为一个字段,因此日期格式中不能有逗号,但可以有空格,而空格在CSV中是被允许的,只要整个字段用双引号包裹。但是,在`git log`输出时,我们使用逗号分隔,而日期内部有空格,所以会被分割。因此,我们需要改变分隔符,或者将日期中的空格替换为其他字符(如T),或者使用其他分隔符。 为了避免日期被分割,我们可以使用不可打印字符作为分隔符,比如`\x1F`(单元分隔符),然后在awk中再转换为逗号分隔并包裹双引号。 因此,改进: (echo "Commit Hash,Author,Date,Message"; \ git log --all --pretty=format:'%H\x1F%an\x1F%ad\x1F%s' --date=iso | \ awk -F'\x1F' -v OFS=',' '{ # 对每个字段进双引号转义并包裹 for(i=1; i<=NF; i++) { # 转义字段内的双引号(替换为两个双引号) gsub(/"/, "\"\"", $i) # 用双引号包裹字段 $i = "\"" $i "\"" } print }') > commits.csv 这样,每个字段都经过转义和包裹,并且字段分隔符是逗号,内部的双引号被转义,日期字段中的空格不会导致分割问题。 注意:第一是表头,我们同样用逗号分隔,并且表头字段不包含特殊字符,所以不需要转义。但是,我们在awk中处理了所有,包括表头?不,我们在echo中输出表头,然后git log输出的是数据。然后通过管道,awk处理的是所有(包括表头)。所以表头也会被包裹双引号。这没有问题。 因此,最终命令如下: 如果是在bash环境中,可以这样写: ```bash echo "Commit Hash,Author,Date,Message" > commits.csv git log --all --pretty=format:'%H\x1F%an\x1F%ad\x1F%s' --date=iso | \ awk -F'\x1F' -v OFS=',' '{ for(i=1; i<=NF; i++) { gsub(/"/, "\"\"", $i) $i = "\"" $i "\"" } print }' >> commits.csv ``` 但是,注意:表头我们单独输出到commits.csv,然后awk处理的结果追加到commits.csv。 另外,如果提交历史很长,这个命令可以处理。 但是,在Windows的cmd中可能不支持这些命令,所以如果是Windows,建议使用Git Bash。 或者,我们可以使用一个更简单的命令,但可能不够健壮(如果字段中不含逗号和双引号,则安全): ```bash git log --all --pretty=format:'"%H","%an","%ad","%s"' --date=iso > commits.csv ``` 然后手动在第一添加表头。 或者,用一条命令: ```bash (echo -e "Commit Hash,Author,Date,Message"; git log --all --pretty=format:'"%H","%an","%ad","%s"' --date=iso) > commits.csv ``` 但是,如果字段中有逗号或双引号,则可能格式错误。 因此,为了健壮性,建议使用第一个使用awk的方法。 另外,如果只需要最近几条,可以加上`-n`选项,比如`-n 100`表示最近100条。 所以,根据需求,我们可以调整。 现在,我们给出一个健壮的版本。 注意:如果字段内包含换符,则会导致数增多,破坏CSV格式。所以,我们确保选取的字段不包含换符。对于提交消息,我们只使用主题(%s),它是一,所以不会包含换符。作者名通常也不包含换符。因此,这个方法是安全的。 总结:我们使用`git log`和`awk`配合,以单元分隔符(\x1F)分隔字段,然后对每个字段进双引号转义并包裹,最后输出为CSV。 注意:单元分隔符在ASCII中是31,在awk中可以用`\x1F`表示。 最后,如果用户需要完整的提交消息(包括多),那么需要额外处理。但这里我们只输出主题。 如果需要完整消息,将`%s`替换为`%B`,但是`%B`会包含换符,我们需要将其替换为空格或其他。例如: 在`git log`的format中,我们可以用`%B`,然后通过`tr`命令将换符替换为空格。但是,这样会使得消息变成一。 修改:将`%s`改为`%B`,并在`git log`输出后用`tr`替换换符: 但是,注意,这样会替换整个记录的换符,而不仅仅是消息字段。所以不。 因此,我们可以在awk中处理:因为我们是按`\x1F`分隔,所以前三个字段不会包含换符(由`git log`的占位符决定),而第四个字段`%B`可能包含。所以,我们可以将第四个字段中的换符替换为空格。 但是,在`git log`的format中使用`%B`时,整个记录会分成多,因为每个提交的日志是分开的,但每个提交内部的消息体中的换符会导致记录跨。这样,我们在awk中读取记录时,一个记录可能被分成多。 所以,为了避免这种情况,我们可以让`git log`将每个提交放在一,因此需要将消息体中的换符替换。可以在`git log`的format中直接替换,但是format不支持。所以,我们可以在`git log`之后用sed将换符替换,但要注意只替换消息体中的换符,而提交记录之间的换符保留(用于分隔记录)。这很难。 因此,建议只使用主题(%s)以避免复杂情况。 所以,我们只输出主题。 如果用户需要完整消息,可以自修改,但要注意处理换符。 现在,我们给出最终的命令(只输出主题):</think>要将 Git 提交历史导出到 CSV 文件,可通过 `git log` 命令配合格式化输出实现。以下是详细步骤和示例: ### 📋 方法步骤 1. **打开终端**:进入 Git 仓库目录 2. **执导出命令**:使用以下命令生成 CSV(按需调整字段): ```bash echo "commit_hash,author,date,message" > commits.csv # 写入表头 git log --pretty=format:'"%H","%an","%ad","%s"' --date=iso >> commits.csv ``` 3. **验证结果**:用 Excel 或文本编辑器打开 `commits.csv`,内容示例如下: ``` commit_hash,author,date,message "a1b2c3d","张三","2023-05-01 10:00:00 +0800","修复登录BUG" "e4f5g6h","李四","2023-04-28 14:30:00 +0800","新增用户模块" ``` ### ⚙️ 参数说明 | 占位符 | 含义 | 示例值 | |--------|---------------|---------------------| | `%H` | 完整提交哈希 | `a1b2c3d...` | | `%an` | 作者姓名 | `张三` | | `%ad` | 作者日期 | `2023-05-01 10:00:00 +0800` | | `%s` | 提交摘要 | `修复登录BUG` | ### 🔧 高级选项 - **添加更多字段**(如邮箱、分支): ```bash git log --pretty=format:'"%H","%an","%ae","%ad","%d","%s"' ``` - **限制记录数量**(如最近 100 条): ```bash git log -100 --pretty=format:... ``` - **指定分支**: ```bash git log main --pretty=format:... ``` ### ⚠️ 注意事项 1. 字段含逗号时自动用双引号包裹(如提交消息) 2. 日期格式推荐 `--date=iso` 保证可读性 3. 完整路径需转义特殊字符(如空格用`\`转义) > 此方法通过标准 Git 命令实现,无需第三方工具[^1]。对于复杂需求(如多消息处理),可结合 `awk` 或 Python 脚本进一步处理。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值