문제
나는 정말 유용하다고 생각합니다. 다음은 데이터를 조작하기 위해 모이는 한 개의 라이너입니다.
ls | awk '{ print "awk " "'"'"'" " {print $1,$2,$3} " "'"'"'" " " $1 ".old_ext > " $1 ".new_ext" }' > file.csh
이 awk를 사용하여 일부 파일 이름을 바꾸고 선택적 열만 인쇄하는 스크립트 파일을 만들었습니다. 누구 든지이 작업을 수행하는 더 좋은 방법을 알고 있습니까? 당신은 하나의 라이너 또는 영리한 조작을 가장 잘 알고 있습니까?
해결책
그만큼 awk 책 훌륭한 예로 가득합니다. 그들은 다운로드를 위해 수집되었습니다 Kernighan의 웹 페이지 (지금 404S).
다른 팁
멋진 하나의 라이너를 찾을 수 있습니다 여기.
나는 이것을 사용한다 :
df -m | awk '{p+=$3}; END {print p}'
파일 시스템을 가로 지르는 시스템에 사용되는 모든 디스크 공간을 총계합니다.
몇 년 전에 나는 awk에서 꼬리 스크립트를 썼습니다.
#!/usr/bin/awk -f
BEGIN {
lines=10
}
{
high = NR % lines + 1
a[high] = $0
}
END {
for (i = 0; i < lines; i++) {
n = (i + high) % lines + 1
if (n in a) {
print a[n]
}
}
}
어리석은 일이지만 Awk가 당신에게하는 일입니다. 그것으로 놀고있는 것은 매우 재미 있습니다.
Henry Spencer는 AWK에서 Nroff의 상당히 좋은 구현을 썼습니다. 그는 그것을 "awf"라고 불렀습니다. 그는 또한 Larry Wall이 Awk가 얼마나 강력한 지 알았다면 Perl을 발명 할 필요가 없었을 것이라고 주장했다.
다음은 내가 정기적으로 사용했던 몇 가지 AWK입니다 ... $ 1, $ 2 등을 사용하여 원하는 열을 꺼낼 수 있습니다. 따라서 많은 파일을 조작하기 위해 예를 들어 MV 대신 사용할 수있는 어리석은 명령이 있습니다 ...
ls -1 *.mp3 | awk '{printf("mv %s newDir/%s\n",$1,$1)}' | /bin/sh
또는 일련의 프로세스를보고 있다면 ...
ps -ef | grep -v username | awk '{printf("kill -9 %s\n",$2)}' | /bin/sh
꽤 사소하지만 그것이 어떻게 당신에게 당신에게 꽤 많은 방법을 얻을 수 있는지 알 수 있습니다. =) 내가했던 대부분의 물건은 Xargs를 사용할 수 있지만 누가 새로운 명령을 필요로 하는가?
이 스크립트를 편집 경로 및 경로와 같은 환경 변수에 많이 사용합니다. 용법:
export PATH=$(clnpath /new/bin:/other/bin:$PATH /old/bin:/other/old/bin)
이 명령은 경로 앞에서/new/bin 및/other/bin을 추가하고, 경로에서/구/빈 및//기타/구/빈을 모두 제거하고 (존재하는 경우 - 없으면 오류가없는 경우) 경로에서 중복 디렉토리 항목을 제거합니다.
: "@(#)$Id: clnpath.sh,v 1.6 1999/06/08 23:34:07 jleffler Exp $"
#
# Print minimal version of $PATH, possibly removing some items
case $# in
0) chop=""; path=${PATH:?};;
1) chop=""; path=$1;;
2) chop=$2; path=$1;;
*) echo "Usage: `basename $0 .sh` [$PATH [remove:list]]" >&2
exit 1;;
esac
# Beware of the quotes in the assignment to chop!
echo "$path" |
${AWK:-awk} -F: '#
BEGIN { # Sort out which path components to omit
chop="'"$chop"'";
if (chop != "") nr = split(chop, remove); else nr = 0;
for (i = 1; i <= nr; i++)
omit[remove[i]] = 1;
}
{
for (i = 1; i <= NF; i++)
{
x=$i;
if (x == "") x = ".";
if (omit[x] == 0 && path[x]++ == 0)
{
output = output pad x;
pad = ":";
}
}
print output;
}'
httpd에서 사용하는 메모리를 계산하십시오
ps -ylC httpd | awk '/[0-9]/ {SUM += $8} END {print SUM/1024}'
또는 httpd를 교체하여 다른 프로세스. MB에서 출력을 얻기 위해 1024로 나뉩니다.
UNIX 용 DOS 트리 명령 에뮬레이터 (찾기 + awk)를 만들었습니다.
find . -type d -print 2>/dev/null|awk '{for (i=1;i< NF;i++)printf("%"length($i)"s","|");gsub(/[^\/]*\//,"--",$0);print $NF}' FS='/'
두 패턴 사이의 인쇄 라인 :
awk '/END/{flag=0}flag;/START/{flag=1}' inputFile
상해: http://nixtip.wordpress.com/2010/10/12/print-lines-between-two-patterns-the-awk-way/
본질적으로 서로 관련이없는 몇 가지 즐겨 찾기. 연결되지 않은 두 가지 제안으로 읽으십시오.
열 번호를 쉽게 식별합니다
:
직장에서 로그 분석과 마찬가지로 AWK를 자주 사용하는 사람들에게는 종종 파일의 열 숫자가 무엇인지 알아 내야합니다. 따라서 Apache Access 파일을 분석하는 경우 (일부 샘플을 찾을 수 있습니다. 여기) 파일에 대해 아래 스크립트를 실행합니다.
NR == 1 {
for (i = 1 ; i <= NF ; i++)
{
print i "\t" $i
}
}
NR > 1 {
exit
}
나는 일반적으로 'c'olumn'n'umbers를 위해 그것을 "cn.awk"라고 부릅니다. 창의적, 어? 어쨌든 출력은 다음과 같습니다.
1 64.242.88.10
2 -
3 -
4 [07/Mar/2004:16:05:49
5 -0800]
6 "GET
7 /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables
8 HTTP/1.1"
9 401
10 12846
무엇이 무엇인지 말하기가 매우 쉽습니다. 나는 보통 내 서버에서 이것을 별칭하고 어디에나 가지고 있습니다.
이름으로 필드를 참조합니다
이제 파일에 헤더 행이 있고 필드 번호 대신 해당 이름을 사용한다고 가정 해 봅시다. 이렇게하면 그렇게 할 수 있습니다.
NR == 1 {
for (i = 1 ; i <= NF ; i++)
{
field[$i] = i
}
}
이제이 헤더 행이 있다고 가정 해 봅시다 ...
metric,time,val,location,http_status,http_request
... 그리고 나는 요약하고 싶다 val
열. 3 달러를 언급하는 대신 이름으로 다음을 참조 할 수 있습니다.
NR > 1 {
SUM += $field["val"]
}
주요 이점은 스크립트를 훨씬 더 읽기 쉽게 만드는 것입니다.
인쇄 필드는 대부분의 AWK 튜토리얼에서 언급 된 첫 번째 것 중 하나입니다.
awk '{print $1,$3}' file
덜 알려져 있지만 똑같이 유용한 분야를 제외하고 가능합니다.
awk '{$1=$3=""}1' file